notifyDataSetChanged উদাহরণ


166

আমি আমার ব্যবহার করার জন্য চেষ্টা করছি একটি জন্য পদ্ধতি কিন্তু এটা আমার জন্য কাজ করে না।Android ApplicationnotifyDataSetChanged()ArrayAdapter

আমি এখানে উত্তর হিসাবে পেয়েছি , notifyDataSetChanged()এটি মূল থ্রেডে চালানো উচিত, তবে এর কোনও উদাহরণ নেই।

কেউ উদাহরণ বা কমপক্ষে একটি লিঙ্ক পাঠাতে পারেন ?!



আপনি এই পরীক্ষা করতে পারবেন ব্লগে এবং এই GitHub উদাহরণ এবং ভাল হিসাবে এই
Cabezas

উত্তর:


328

একটি জন্য ArrayAdapter, notifyDataSetChangedশুধুমাত্র যদি আপনি ব্যবহার করে add(), insert(), remove(), এবং clear()অ্যাডাপ্টার উপর।

যখন একটি ArrayAdapterসংস্থাপিত হয়, তার জন্য রেফারেন্স ঝুলিতে Listযে পাস হয়। আপনি যদি একটি মধ্যে পাস হলে Listযে ভ্রমণ সদস্য ছিলেন, এবং যে কার্যকলাপ সদস্য পরে, পরিবর্তন ArrayAdapterএখনো মূল একটি রেফারেন্স ধারণ করা হয় List। অ্যাডাপ্টার জানেন না যে আপনি Listক্রিয়াকলাপটি পরিবর্তন করেছেন ।

আপনার পছন্দগুলি হ'ল:

  1. কার্যাবলী ব্যবহার করুন ArrayAdapterঅন্তর্নিহিত তালিকা পরিবর্তন করতে ( add(), insert(), remove(), clear(), ইত্যাদি)
  2. ArrayAdapterনতুন Listডেটা দিয়ে আবার তৈরি করুন । (প্রচুর সংস্থান এবং আবর্জনা সংগ্রহ ব্যবহার করে))
  3. থেকে উদ্ভূত আপনার নিজস্ব শ্রেণি তৈরি করুন BaseAdapterএবং ListAdapterএটি অন্তর্নিহিত Listডেটা কাঠামো পরিবর্তনের অনুমতি দেয় ।
  4. notifyDataSetChanged()প্রতিটি সময় তালিকা আপডেট হওয়ার পরে ব্যবহার করুন । UI 'তে-থ্রেডে সেটিতে কল করতে, runOnUiThread()এর Activity। তাহলে, notifyDataSetChanged()কাজ করবে।

13
আপনার ডেটাতে 'নতুন' অবজেক্ট বরাদ্দ দেওয়ার বিষয়েও সাবধান হন। ব্যবহার পরিষ্কার () এর পরিবর্তে, তথ্য repopulate / করা পরিবর্তনগুলি, তারপর notifyDataSetChanged (কল)
moonlightcheese

কিন্তু কি যদি আমরা কল notifyDataSetChanged()পদ্ধতিতে: ((BaseAdapter) arrayAdapter).notifyDataSetChanged();?
teoREtik

2
আমি বেসএক্সপ্যান্ডেবললিস্টএডাপ্টার ব্যবহার করি, এতে অ্যাড () বা অপসারণ () ফাংশন নেই তাই আমি আমার মানচিত্রকে সদস্য ভেরিয়েবল হিসাবে সঞ্চয় করি। আমি মানচিত্র আপডেট করি এবং বিজ্ঞপ্তি ডেটাসেটচ্যাঞ্জড () কল করি তবে কিছুই হয় না। আমি যখন পছন্দ # 4 ব্যবহার করি তখন এটি কার্যকর হয়। কেন ???
পান্না

আমি কাস্টম গ্রিডভিউয়ের জন্য অ্যারেএডাপ্টার ব্যবহার করছি, অ্যাডাপ্টার.এডিডি (ডেটা রিসিভড) কল করে আমি url থেকে চিত্রগুলি যুক্ত করার সাথে সাথে চিত্রগুলি যুক্ত করছি। এটি সূক্ষ্মভাবে কাজ করে ডেটা যুক্ত করে তবে তা কেন সতেজ হয় এবং শীর্ষে যাচ্ছে। আমি আইটেমগুলি প্রদর্শন করতে চাই কারণ তারা রিফ্রেশ তালিকা ছাড়াই যুক্ত হবে। (কী করতে চান তা অ্যান্ড্রয়েডের গ্রিডভিউ দিয়ে notifyDatasetChanged () ব্যবহার করে কাজ করছে) আমি কীভাবে এটি তৈরি করতে পারি এই কাস্টমগ্রিডভিউতে (স্তম্ভিতগ্রিডভিউ)।
MobileEvangelist

1
তালিকায় বাছাইয়ের পদ্ধতিগুলি যুক্ত করার জন্য আমি আমার নিজস্ব বেসএডাপ্টার তৈরি করার চেষ্টা করেছি, তবে কোনও কারণে এটি কার্যকর হবে না। আমার অ্যাপ্লিকেশনটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ছড়িয়ে পড়া অ্যারেলিস্ট দিয়ে পুরো অ্যাডাপ্টারটি পুনরায় তৈরি করা হলেও এটি আমাকে বিরক্ত করে না। যদিও এটি কীভাবে প্রচুর আবর্জনা তৈরি করবে? আমি ধরে নিই যে ব্যয়বহুল ডেটার আসল অ্যারেটি অ্যাডাপ্টারকে কল করার ক্রিয়াকলাপ হিসাবে একটি রেফারেন্স হিসাবে রাখা হয়েছে, যার অর্থ কেবল অ্যাডাপ্টার সংগ্রহ করা হবে।
G_V

34

আপনি runOnUiThread()নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন । যদি আপনি একটি ব্যবহার না করে থাকেন তবে আপনার ListActivityরেফারেন্স পেতে কোডটি খাপ খেয়ে নিন ArrayAdapter

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

1
আমি নিজের কোডটিতে আপনার কোডের টুকরোটি যুক্ত করার চেষ্টা করেছি (আপনি এটি এখানে সন্ধান করতে পারেন stackoverflow.com/questions/3667442/how-to-refresh-adapter ) অনক্রিট পদ্ধতিতে, তবে আমার এখনও কোনও সাফল্য নেই :( এটি যুক্ত করার জন্য এটি ভুল জায়গা ছিল ?!
টিমা

1
আপনার প্রশ্নটি সবেমাত্র জিজ্ঞাসা করেছিল যে আপনি কীভাবে পদ্ধতিটি কল করতে পারেন এবং এটি মূল UI থ্রেডে চালিত করতে পারেন। এই প্রশ্নের উত্তর। আপনার নির্দিষ্ট যদি ( stackoverflow.com/questions/3670500/... ) AsyncTask এবং তার onPostExecute () মেথড কি আপনি বিবেচনা করা উচিত বলে মনে হচ্ছে।
ব্রায়ান

12

আমি সম্প্রতি এই বিষয়টিতে লিখেছি, যদিও এই পোস্টটি এটি পুরানো, তবে আমি ভেবেছিলাম যে এটি বাস্তবায়নের উপায়টি জানতে আগ্রহী তার পক্ষে সহায়ক হবে BaseAdapter.notifyDataSetChanged() ধাপে ধাপে এবং সঠিক উপায়ে ।

অ্যান্ড্রয়েডে বেসএডাপ্টার.নোটেফাই ডেটাসেট চেঞ্জড () বা নতুন ব্লগ বেসএডাপ্টার.নোটেফাই ডেটাসেটচ্যাঞ্জড () সঠিকভাবে প্রয়োগ করতে দয়া করে অনুসরণ করুন ।


হাই আমি প্রথম লিঙ্ক উদাহরণটি চেষ্টা করেছিলাম, তবে পরিবর্তে mItem.add(), আমি কেবল একটি উপাদান সম্পাদনা করেছি যার অর্থ mItem.get(position).setImage(encodedImage)নলপয়েন্টার এক্সপিশন কেন ত্রুটি দিচ্ছে তা হতে পারে। সুতরাং ডেটাসেটচেন্জটি কেবল এটি সম্পাদনা করার ক্ষেত্রে কাজ করে না, অ্যারে অ্যাডাপ্টারের জন্য বিসিজেড এটি উপরে উল্লিখিত কাজ করে কেবল যুক্ত (), পরিষ্কার (), অপসারণ () ইত্যাদির জন্য
শ্রিক্যান্ট এন

notifyDataSetChanged ডেটা সেট সম্পাদনা বা পরিবর্তন করার জন্য কাজ করবে, আপনার নাল পয়েন্টারটি অন্য কোনও কারণে, লগগুলি চেক করুন।
আরিফ নাদিম

7

আমার একই সমস্যা ছিল এবং আমি পুরো অ্যারেএডাপ্টারকে একটানা একটি নতুন উদাহরণ দিয়ে প্রতিস্থাপন করতে পছন্দ করি না। সুতরাং আমার কাছে অ্যাডাপ্টারহেলপারটি ভারী উত্তোলন অন্য কোথাও করতে হবে।

এটি যুক্ত করুন যেখানে আপনি সাধারণত কল নোটিফিকেশন করবেন (চেষ্টা করার চেষ্টা করুন)

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

অ্যাডাপ্টারহেল্পার ক্লাস

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}

আমার কোডে আমার আরও কয়েকজন অ্যারেএডাপ্টার রয়েছে এবং তারা ইস্যু ছাড়াই কাজ করেছে। আজ রাতে, আমি একটি সিম্পলসার্সার অ্যাডাপ্টারকে একটি অ্যারেএডাপ্টারে পরিণত করার সিদ্ধান্ত নিয়েছি এবং এটি কাজ করবে না। এটির সাথে কয়েক ঘন্টা লড়াই করে এবং এটি কাজ না করার কারণ অনুসন্ধান করার পরে, আমি আপনার অ্যাডাপ্টারহেলপার ক্লাস পেয়েছি এবং এখন এটি কাজ করে! ধন্যবাদ!
গর্বিতেকদাদ

1
এটি সহজেই কোনও ফাংশনে করা যায় ... আপনি কেন এটির জন্য একটি নতুন শ্রেণি ইনস্ট্যান্ট করবেন?
techiServices

2
জাভায় ফাংশনগুলিকে মেথড বলে। আপনি কী প্রস্তাব করবেন, অ্যারে অ্যাডাপ্টারের মতো একই শ্রেণিতে সম্ভবত এটি পুনরায় ব্যবহারযোগ্য পদ্ধতি রয়েছে? অথবা খণ্ডিত / ক্রিয়াকলাপে তালিকার দর্শন রয়েছে? হ্যাঁ, এটি এমন একটি শ্রেণিতে যেখানে এটি পুনরায় ব্যবহার করা যেতে পারে। আপনি যদি এটি কোনও উপায়ে স্থির করতে চান তবে এগিয়ে যান।
কেভিন পার্কার

1
চমৎকার ধারণা. আর একটিতে অ্যারেএডাপ্টার প্রসারিত করা হবে, যার নাম অ্যারেএডাপ্টারকম্প্যাট এবং অ্যাডএল (..) পদ্ধতিটি ওভাররাইড করা হবে, যেহেতু এটি একমাত্র এপিআই ১১. থেকে পাওয়া যায়, সেখানে, super.addAll(..)এআইপিআই স্তরটি যাচাই করুন এবং এপিআই> ১১ এবং সুপার.এডিডি (..) এর জন্য ব্যবহার করুন .. ) আপনার মত পুনরাবৃত্তির সঙ্গে একযোগে: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }। এখন আপনার নতুন অ্যাডাপ্টার শ্রেণি থেকে প্রসারিত করুন।
কনসুমিয়ারার

পারফেক্ট! কেভিনকে অনেক অনেক ধন্যবাদ - আমার যা প্রয়োজন তা হুবহু এই ছিল!
কিবি

3

আমি জানি এটি একটি দেরিতে প্রতিক্রিয়া তবে আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি এবং আমি notifyDataSetChanged()সঠিক জায়গায় ব্যবহার করে এটি সমাধান করতে পেরেছি ।

সুতরাং আমার পরিস্থিতি নিম্নরূপ ছিল।

সম্পূর্ণ অ্যাক্টিভিটি থেকে ফিরে আসা সামগ্রী সহ আমাকে একটি অ্যাকশন বার ট্যাবে (টুকরা) তালিকার একটি আপডেট ভিউ আপডেট করতে হয়েছিল। প্রাথমিকভাবে তবে, তালিকাভিউ কোনও পরিবর্তন প্রতিফলিত করবে না। যাইহোক, আমি যখন অন্য ট্যাবটি ক্লিক করেছি এবং তারপরে পছন্দসই ট্যাবে ফিরে আসছি, অন্য ক্রিয়াকলাপ থেকে সঠিক সামগ্রী সহ তালিকার ভিউ আপডেট করা হবে। সুতরাং এটি সমাধান করার জন্য আমি ব্যবহার করেছিnotifyDataSetChanged() ক্রিয়াকলাপের কোডটিতে অ্যাকশন বার অ্যাডাপ্টারের যা ডেটা ফেরত দিতে হয়েছিল।

এটি কোড স্নিপেট যা আমি কার্যকলাপে ব্যবহার করি।

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) 
    {
        case R.id.action_new_forward:

            FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
            Intent ina = new Intent(getApplicationContext(), MainActivity.class);
            ina.putExtra("stra", values1);
            startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
    }
}

এই ক্রিয়াকলাপটিতে কিছু ডেটা ফেরত আসবে FragmentTab2এবং এতে আমার তালিকাভিউটি সরাসরি আপডেট করেFragmentTab2

আশা করি কেউ এই কাজে লাগবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.