কীভাবে অ্যান্ড্রয়েড তালিকার ভিউ রিফ্রেশ করবেন?


436

ListViewগতিশীল ডেটা যুক্ত / মুছে ফেলার পরে কীভাবে একটি অ্যান্ড্রয়েড রিফ্রেশ করবেন ?


3
অন্য সমাধানগুলি যদি কাজ না করে তবে রিফ্রেশড্র্যাব্যাবলস্টেট চেষ্টা করুন। প্রপসকে স্ট্যাকওভারফ্লো.com
এডউইন ইভান্স

যদি আপনার সাহায্যের হতে পারে stackoverflow.com/a/17333384/596555
boiledwater

এখানে একটি উদাহরণ টিউটোরিয়ালকোট.কোটলিন- অ্যান্ড্রয়েড /… আপনাকে সাহায্য করতে পারে।
মল্লিকার্জুন এম

উত্তর:


530

একবার আপনি সেই অ্যাডাপ্টারের ডেটা সংশোধন notifyDataSetChanged()করে আপনার Adapterঅবজেক্টে কল করুন ।

কিভাবে / কখন কল notifyDataSetChanged()করতে হবে তার কিছু অতিরিক্ত সুনির্দিষ্ট এই গুগল আই / ও ভিডিওতে দেখা যেতে পারে ।


24
আপনার এটি ইউআই থ্রেডে চালানো উচিত। ইউআই থ্রেডের মধ্যে একটি হ্যান্ডলার তৈরি করুন এবং তারপরে এটি চলমান পোস্ট করুন
কিরিল

11
আবারও: notifyDataSetChanged () কমপক্ষে ব্যবহার করা অনুশীলনের জন্য কাজ করে না যা পুনরায় সংস্থাপিত হয় (পড়ুন অবনমিত নয়)। যদি তালিকাভিউ, কার্সার অ্যাডাপ্টার এবং সামগ্রী সরবরাহকারী ব্যবহার করা হয় তবে আপনি লাইনগুলি বরাবর কিছু চেষ্টা করতে পারেন: gettLoaderManager ()। পুনঃসূচনা লোডার ()। দেখুন: stackoverflow.com/a/19657500/1087411 আমি notifyDataSetChanged () এ কমপক্ষে কিছু ডকুমেন্টেশন দেখতে চাই। অ্যান্ড্রয়েডে অনেক কিছুই ব্ল্যাক বক্স টেস্টিংয়ে রেখে গেছে।
অ্যান্ডারসন

যদি বিজ্ঞপ্তি ডেটাসেট চেঞ্জড কাজ না করে তবে আপনিই এটির ভুল করছেন
zdarsky.peter

4
notifyDataSetChanged সবসময় কাজ করে না। আমি নিশ্চিত নই কেন এটি বিতর্কিত। কখনও কখনও আপনাকে পুরানো ভিউগুলি সাফ করতে তালিকাভিউ.সেটএডাপ্টার (অ্যাডাপ্টার) কল করতে হবে। আরও দেখুন: stackoverflow.com/a/16261588/153275

1
আমি কখনই বিজ্ঞপ্তি ডেটাসেট চেঞ্জড কাজ করতে সক্ষম হইনি। আমি পরিষ্কারভাবে দেখতে পেলাম যে আমি অ্যাডাপ্টারে ফিড সংগ্রহ করেছি তা পরিবর্তিত হয়েছে (উপাদানগুলি সরানো হয়েছে) তবে বিজ্ঞপ্তিডেটসেটচ্যাঞ্জড কখনও কিছুই করেনি। নিশ্চিত না এই পদ্ধতিটি কি কেবল ভেঙে গেছে?
বাইমুট করুন

204

এছাড়াও আপনি এটি ব্যবহার করতে পারেন:

myListView.invalidateViews();

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

প্রকৃতপক্ষে invalidateViews()উত্স কোড সেটগুলিতে mDataChanged = true;তাই আমি নিশ্চিত নই যে এর ফলাফলের তুলনায় আরও ভাল পারফরম্যান্সের ফলাফল হয়notifyDataSetChanged()
ওয়াওভोस्স্ট

তুমি আমার দিন বাঁচিয়েছ, বন্ধু!
oskarko

আপনি এমন এক ধরণের তালিকা নিতে পারেন যা "পর্যবেক্ষণযোগ্য তালিকা", নোটিফডেটসেট পরিবর্তন করার দরকার নেই
প্রিয়া

153

সব উপেক্ষা দয়া করে invalidate(), invalidateViews(), requestLayout(), ... এই প্রশ্নের উত্তর।

করণীয় সঠিক জিনিস (এবং ভাগ্যক্রমে সঠিক উত্তর হিসাবে চিহ্নিতও করা হয়েছে) আপনার অ্যাডাপ্টারে কল notifyDataSetChanged()করা

সমস্যা সমাধান

কলিং notifyDataSetChanged()সমস্ত লেআউট পদ্ধতি কার্যকর না করে যদি কাজ করে না। বিশ্বাস করুনListView সঠিকভাবে আপডেট হয়েছিল। আপনি যদি পার্থক্যটি সন্ধান করতে ব্যর্থ হন তবে আপনার অ্যাডাপ্টারের ডেটা কোথা থেকে এসেছে তা যাচাই করতে হবে।

এটি যদি আপনি কেবল স্মৃতিতে রাখছেন এমন একটি সংগ্রহ হয় তা পরীক্ষা করে দেখার আগে আপনি সংগ্রহ থেকে আসলে আইটেম (গুলি) মুছে ফেলেছেন বা যুক্ত করেছেন তা পরীক্ষা করে দেখুন notifyDataSetChanged()

আপনি একটি ডাটাবেস সঙ্গেও কাজ করছি বা সেবা ব্যাক-এন্ডের আপনি কল করার আগে তথ্য আবার পুনরুদ্ধার করতে পদ্ধতি কল (বা মেমরি তথ্য নিপূণভাবে) থাকবে notifyDataSetChanged()

জিনিসটি কেবল notifyDataSetChangedতখনই কাজ করে যদি ডেটাसेटটি পরিবর্তিত হয়। সুতরাং আপনি যদি সেই পরিবর্তনগুলি দেখতে না পান তবে এটি দেখার জায়গা। প্রয়োজনে ডিবাগ করুন।

অ্যারেএডাপ্টার বনাম বেসএডাপ্টার

আমি আবিষ্কার করেছি যে এমন একটি অ্যাডাপ্টারের সাথে কাজ করা যা আপনাকে সংগ্রহ পরিচালনা করতে দেয়, যেমন বেসএডাপ্টার আরও ভাল কাজ করে। অ্যারেএডাপ্টারের মতো কিছু অ্যাডাপ্টার ইতিমধ্যে তাদের নিজস্ব সংগ্রহ পরিচালনা করে যাতে আপডেটের জন্য সঠিক সংগ্রহে যাওয়া আরও শক্ত হয়ে যায়। এটি সত্যিই বেশিরভাগ ক্ষেত্রে অসুবিধার অতিরিক্ত অযৌক্তিক স্তর।

ইউআই থ্রেড

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

দ্রুত উদাহরণ প্রকল্প

Https://github.com/hanscappelle/so-2250770.git এ পাওয়া যাবে । অ্যান্ড্রয়েড স্টুডিওতে (গ্রেডেল) প্রজেক্টটি কেবল ক্লোন করুন এবং খুলুন। এই প্রকল্পের একটি মাইনএসিটিভিটি বিল্ডিং রয়েছে একটিListView এলোমেলো ডেটা সহ । অ্যাকশন মেনু ব্যবহার করে এই তালিকাটি রিফ্রেশ করা যেতে পারে।

এই উদাহরণটির জন্য আমি তৈরি করা অ্যাডাপ্টারের বাস্তবায়ন মডেলবজেক্ট ডেটা সংগ্রহকে প্রকাশ করে

public class MyListAdapter extends BaseAdapter {

    /**
     * this is our own collection of data, can be anything we 
     * want it to be as long as we get the abstract methods 
     * implemented using this data and work on this data 
     * (see getter) you should be fine
     */
    private List<ModelObject> mData;

    /**
     * our ctor for this adapter, we'll accept all the things 
     * we need here
     *
     * @param mData
     */
    public MyListAdapter(final Context context, final List<ModelObject> mData) {
        this.mData = mData;
        this.mContext = context;
    }

    public List<ModelObject> getData() {
        return mData;
    }

    // implement all abstract methods here
}

মেইনএ্যাকটিভিটি থেকে কোড

public class MainActivity extends Activity {

    private MyListAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView list = (ListView) findViewById(R.id.list);

        // create some dummy data here
        List<ModelObject> objects = getRandomData();
        // and put it into an adapter for the list
        mAdapter = new MyListAdapter(this, objects);
        list.setAdapter(mAdapter);

        // mAdapter is available in the helper methods below and the 
        // data will be updated based on action menu interactions

        // you could also keep the reference to the android ListView 
        // object instead and use the {@link ListView#getAdapter()} 
        // method instead. However you would have to cast that adapter 
        // to your own instance every time
    }

    /**
     * helper to show what happens when all data is new
     */
    private void reloadAllData(){
        // get new modified random data
        List<ModelObject> objects = getRandomData();
        // update data in our adapter
        mAdapter.getData().clear();
        mAdapter.getData().addAll(objects);
        // fire the event
        mAdapter.notifyDataSetChanged();
    }

    /**
     * helper to show how only changing properties of data 
     * elements also works
     */
    private void scrambleChecked(){
        Random random = new Random();
        // update data in our adapter, iterate all objects and 
        // resetting the checked option
        for( ModelObject mo : mAdapter.getData()) {
            mo.setChecked(random.nextBoolean());
        }
        // fire the event
        mAdapter.notifyDataSetChanged();
    }
}

অধিক তথ্য

তালিকার শক্তিগুলির পাওয়ার সম্পর্কে আরও একটি সুন্দর পোস্ট এখানে পাওয়া যায়: http://www.vogella.com/articles/AndroidListView/article.html


16
আপনি ভুল. notifyDataSetChanged () আমার পক্ষে কাজ করে নি, তবে অকার্যকর ভিউজ () এটি সঠিকভাবে করেছে।
বাবাই

6
আমার তালিকাগুলির প্রকৃত উপাদানগুলি পরিবর্তিত হয় না এমন সমস্যা রয়েছে, যেমন একই পরিমাণের উপাদান। তবে সমস্যাটি হ'ল তাদের উপস্থাপনের পদ্ধতিটি পরিবর্তনের প্রয়োজন। তার মানে হল ইউআই তৈরির জন্য আমার অ্যাডাপ্টারের কোডটি আবার চালানো দরকার এবং তারপরে তালিকার সারিগুলিতে কিছু উপাদান সঠিকভাবে লুকিয়ে রাখা দরকার। notifyDataSetChanged () কাজ করে না ...
Sven Haiges

9
এই উত্তরটি আমাকে সত্যিই সাহায্য করেছিল। নির্দিষ্ট বৈশিষ্ট্যের কারণে আমি অ্যারেটিকে স্মৃতিতে রাখছিলাম। এটি ঠিক করার জন্য আমি এখনই কল করব adapter.clear(), এবং কল adapter.addAll(Array<T>)করার আগেnotifyDataSetChanged()
মাইকেল ডিফিলিপস

2
@ এইচসিপিএল, আমি যদি চেকবক্সের জন্য অ্যাডাপ্টারের অনক্লিকলিস্টনারে থাকি তবে কীভাবে নোটিফিকেশন ডেটাসেট চেঞ্জড করব? অবৈধ ভিউজগুলি এখনই কাজটি সম্পন্ন করছে। কেন অবৈধ ভিউগুলি কল করার জন্য ভুল পদ্ধতিটি দেখেছে?
craned

1
আমি কখনই বিজ্ঞপ্তি ডেটাসেট চেঞ্জড কাজ করতে সক্ষম হইনি। আমি পরিষ্কারভাবে দেখতে পেলাম যে আমি অ্যাডাপ্টারে ফিড সংগ্রহ করেছি তা পরিবর্তিত হয়েছে (উপাদানগুলি সরানো হয়েছে) তবে বিজ্ঞপ্তিডেটসেটচ্যাঞ্জড কখনও কিছুই করেনি। নিশ্চিত না এই পদ্ধতিটি কি কেবল ভেঙে গেছে?
বাইমুট করুন

42

আপনি যখনই চান রান রানযোগ্য কল করুন:

runOnUiThread(run);

OnCreate(), আপনি আপনার চলমান থ্রেড সেট করেছেন:

run = new Runnable() {
    public void run() {
        //reload content
        arraylist.clear();
        arraylist.addAll(db.readAll());
        adapter.notifyDataSetChanged();
        listview.invalidateViews();
        listview.refreshDrawableState();
    }
};

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

ধন্যবাদ! এটা আমার জন্য কাজ করে. যে সমস্ত লোক এটি একটি খণ্ডন থেকে চালাতে চান তাদের জন্য আপনার getActivity () ব্যবহার করা উচিত runউইনউইথ্রেড (নতুন রান্নেবল ... কোডটি ইউআই থ্রেডে চালিত হয়েছে তা নিশ্চিত করার জন্য
কোডিংপাস

আমি এর উদ্দেশ্য দেখতে পাচ্ছি না run = new Runnable()এবং কেবলমাত্র আমার ফাংশনটিকে এমন একটি public void refreshUIThread()পদ্ধতি দিয়েছি run()যা আপনার পদ্ধতির মডেল করে (যা খুব কার্যকর)।
টি.ওউডি

11

আমি আমার তালিকার গতিশীল রিফ্রেশ নিয়ে কিছু সমস্যা পেয়েছি।

আপনার অ্যাডাপ্টারে নোটিফাইড ডেটাসেট চেঞ্জড () কল করুন।

কীভাবে / কখন notifyDataSetChanged () কল করবেন সে সম্পর্কে কিছু অতিরিক্ত সুনির্দিষ্ট এই গুগল আই / ও ভিডিওতে দেখা যাবে।

notifyDataSetChanged () আমার ক্ষেত্রে সঠিকভাবে কাজ করে নি [আমি অন্য শ্রেণি থেকে notifyDataSetChanged কল করেছি]। সেক্ষেত্রে আমি চলমান ক্রিয়াকলাপ (থ্রেড) এ তালিকাভিউটি সম্পাদনা করেছি। ক্রিস্টোফারকে ধন্যবাদ জানিয়ে ভিডিওটি চূড়ান্ত ইঙ্গিত দিয়েছে।

আমার দ্বিতীয় শ্রেণিতে আমি ব্যবহার করেছি

Runnable run = new Runnable(){
     public void run(){
         contactsActivity.update();
     }
};
contactsActivity.runOnUiThread(run);

আমার ক্রিয়াকলাপ থেকে আপডেট () আপডেট করতে। এই আপডেট অন্তর্ভুক্ত

myAdapter.notifyDataSetChanged();

অ্যাডাপ্টারকে ভিউ রিফ্রেশ করতে বলুন। যতদূর আমি বলতে পারি সূক্ষ্মভাবে কাজ করেছি।



5

আপনি যদি এখনও তালিকাগুলির রিফ্রেশমেন্টে সন্তুষ্ট না হন তবে আপনি এই স্নিপেটটি দেখতে পারেন, এটি ডিবি থেকে তালিকাটি ভিউ লোড করার জন্য, আসলে আপনাকে যা করতে হবে তা হল কেবলমাত্র তালিকাভিউ পুনরায় লোড করা, আপনি কোনও সিআরইউডি অপারেশন করার পরে এটি সর্বোত্তম উপায় নয় to কোড, তবে এটি আপনার ইচ্ছা অনুসারে তালিকাগুলিকে রিফ্রেশ করবে ..

এটি আমার পক্ষে কাজ করে .... যদি আপনি আরও ভাল সমাধান পান তবে দয়া করে ভাগ করুন ...

.......
......
আপনার সিআরইউডি অপারেশন করুন ..
......
.....
DBAdapter.open ();
DBAdapter.insert_into_SingleList ();
// সেই ডিবি_সালট আনুন এবং এটিকে তার সামগ্রী হিসাবে তালিকায় যুক্ত করুন ....
                                            ls2.setAdapter (নতুন অ্যারেএডাপ্টার (DynTABSample.th এই,
    android.R.layout.simple_list_item_1, DBAdapter.DB_ListView));
                                            DBAdapter.close ();

2

এই পোস্টে লোকেরা প্রস্তাবিত সমাধানগুলি কার্যকরভাবে আপনার ডিভাইসের অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে না works উদাহরণস্বরূপ অ্যাডএল পদ্ধতিটি ব্যবহার করার জন্য আপনাকে অ্যান্ড্রয়েড ডিভাইসে minSdkVersion = "10" লাগাতে হবে।

সমস্ত ডিভাইসগুলির জন্য এই প্রশ্নগুলির সমাধান করার জন্য আমি আমার নিজের অ্যাডাপ্টারে নিজস্ব পদ্ধতি তৈরি করেছি এবং অ্যাডের অভ্যন্তরে ব্যবহার করব এবং অ্যারেএডাপ্টার থেকে পদ্ধতির উত্তরাধিকার সরিয়ে ফেলুন যা আপনাকে সমস্যা ছাড়াই ডেটা আপডেট করে।

আমার কোড: আমার নিজের ডেটা বর্গের রেসআরসুল্ট ব্যবহার করে আপনি নিজের ডেটা মডেল ব্যবহার করেন।

ResultGpRowAdapter.java

public class ResultGpRowAdapter extends ArrayAdapter<RaceResult> {

    Context context;
    int resource;
    List<RaceResult> data=null;

        public ResultGpRowAdapter(Context context, int resource, List<RaceResult> objects)           {
        super(context, resource, objects);

        this.context = context;
        this.resource = resource;
        this.data = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ........
        }

        //my own method to populate data           
        public void myAddAll(List<RaceResult> items) {

        for (RaceResult item:items){
            super.add(item);
        }
    }

ResultsGp.java

public class ResultsGp extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    ...........
    ...........
    ListView list = (ListView)findViewById(R.id.resultsGpList); 

    ResultGpRowAdapter adapter = new ResultGpRowAdapter(this,  R.layout.activity_result_gp_row, new ArrayList<RaceResult>()); //Empty data

   list.setAdapter(adapter);

   .... 
   ....
   ....
   //LOAD a ArrayList<RaceResult> with data

   ArrayList<RaceResult> data = new ArrayList<RaceResult>();
   data.add(new RaceResult(....));
   data.add(new RaceResult(....));
   .......

   adapter.myAddAll(data); //Your list will be udpdated!!!

1

আপনি রিফ্রেশ করার সময় যদি আপনি আপনার স্ক্রোলের অবস্থান বজায় রাখতে চান এবং আপনি এটি করতে পারেন:

if (mEventListView.getAdapter() == null) {
    EventLogAdapter eventLogAdapter = new EventLogAdapter(mContext, events);
    mEventListView.setAdapter(eventLogAdapter);
} else {
    ((EventLogAdapter)mEventListView.getAdapter()).refill(events);
}

public void refill(List<EventLog> events) {
    mEvents.clear();
    mEvents.addAll(events);
    notifyDataSetChanged();
}

বিশদ তথ্যের জন্য, দয়া করে অ্যান্ড্রয়েড তালিকাটি দেখুন: আপনি রিফ্রেশ করার সময় আপনার স্ক্রোলের অবস্থান বজায় রাখুন


1

myArrayList.remove(position);শ্রোতার ভিতরে কেবল ব্যবহার করুন :

  myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override public void onItemClick(AdapterView<?> parent, android.view.View view, int position, long id) {
           myArrayList.remove(position);
           myArrayAdapter.notifyDataSetChanged();
        }
    });

1

আপনি যে তালিকা whoose ডেটা আপনার উপর বৃদ্ধি করছে একটি একক বস্তু ব্যবহার করতে হবে ListView। যদি রেফারেন্স পরিবর্তন হয় তবে notifyDataSetChanged()কাজ করে না list আপনি যখন তালিকা ভিউ থেকে উপাদানগুলি মুছছেন তখন আপনি যে তালিকাটি অ্যারেলিস্ট <> বা অন্য কোনও কিছুর জন্য ব্যবহার করছেন তা তালিকাগুলি থেকে মুছে ফেলুন তবে notifyDataSetChanged()আপনার অ্যাডাপ্টার শ্রেণীর অবজেক্টে কল করুন।

নীচে দেখুন আমার অ্যাডাপ্টারে আমি কীভাবে এটি পরিচালনা করেছি তা এখানে দেখুন

public class CountryCodeListAdapter extends BaseAdapter implements OnItemClickListener{

private Context context;
private ArrayList<CountryDataObject> dObj;
private ViewHolder holder;
private Typeface itemFont;
private int selectedPosition=-1;
private ArrayList<CountryDataObject> completeList;

public CountryCodeListAdapter(Context context, ArrayList<CountryDataObject> dObj) {
    this.context = context;
    this.dObj=dObj;
    completeList=new  ArrayList<CountryDataObject>();
    completeList.addAll(dObj);
    itemFont=Typeface.createFromAsset(context.getAssets(), "CaviarDreams.ttf");
}

@Override
public int getCount() {
    return dObj.size();
}

@Override
public Object getItem(int position) {
    return dObj.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
    if(view==null){
        holder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.states_inflator_layout, null);
        holder.textView = ((TextView)view.findViewById(R.id.stateNameInflator));
        holder.checkImg=(ImageView)view.findViewById(R.id.checkBoxState);
        view.setTag(holder);
    }else{
        holder = (ViewHolder) view.getTag();
    }
    holder.textView.setText(dObj.get(position).getCountryName());
    holder.textView.setTypeface(itemFont);

    if(position==selectedPosition)
     {
         holder.checkImg.setImageResource(R.drawable.check);
     }
     else
     {
         holder.checkImg.setImageResource(R.drawable.uncheck);
     }
    return view;
}
private class ViewHolder{
    private TextView textView;
    private ImageView checkImg;
}

public void getFilter(String name) {
    dObj.clear();
    if(!name.equals("")){
    for (CountryDataObject item : completeList) {
        if(item.getCountryName().toLowerCase().startsWith(name.toLowerCase(),0)){
            dObj.add(item);
        }
    }
    }
    else {
        dObj.addAll(completeList);
    }
    selectedPosition=-1;
    notifyDataSetChanged();
    notifyDataSetInvalidated(); 
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    Registration reg=(Registration)context;
    selectedPosition=position;
    reg.setSelectedCountryCode("+"+dObj.get(position).getCountryCode());
    notifyDataSetChanged();
}
}

1
আপনার ব্যাখ্যাটি আন্ডাররেটেড হয়েছে তবে এটি সত্যই আমাকে অ্যারেলিস্ট রেফারেন্স সম্পর্কে বুঝতে দেয়। আপনাকে ধন্যবাদ
আব্রাহাম পুত্র প্রকাশ

0

তালিকা ভিউ থেকে ডেটা মুছে ফেলার পরে, আপনাকে কল করতে হবে refreshDrawableState()। এখানে উদাহরণ:

final DatabaseHelper db = new DatabaseHelper (ActivityName.this);

db.open();

db.deleteContact(arg3);

mListView.refreshDrawableState();

db.close();

এবং deleteContactপদ্ধতি DatabaseHelperবর্গ কিছুটা মত দেখাচ্ছে হতে হবে

public boolean deleteContact(long rowId) {

   return db.delete(TABLE_NAME, BaseColumns._ID + "=" + rowId, null) > 0;

}

0

আমি আমার সিম্পলএডাপ্টার আপডেট করার বিষয়ে বিজ্ঞপ্তি ডেটাসেট চেঞ্জড () পেতে সক্ষম হয়েছি না, সুতরাং এর পরিবর্তে আমি প্রথমে সরানোআলভিউস () ব্যবহার করে প্যারেন্ট লেআউটের সাথে সংযুক্ত সমস্ত দৃষ্টিভঙ্গি অপসারণের চেষ্টা করেছি, তারপরে তালিকাগুলি যুক্ত করেছি, এবং সেই কাজটি আমাকে আপডেট করার অনুমতি দিয়েছিল UI 'তে:

LinearLayout results = (LinearLayout)findViewById(R.id.results);
ListView lv = new ListView(this);
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
SimpleAdapter adapter = new SimpleAdapter( this, list, R.layout.directory_row, 
                new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept } );

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("name", name);
    map.put("dept", dept);
    list.add(map);
}

lv.setAdapter(adapter);
results.removeAllViews();     
results.addView(lv);

0

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

private List<List<SomeNewArray>> arrayList;
List<SomeNewArray> array1= getArrayList(...);
List<SomeNewArray> array2= getArrayList(...);
arrayList.clear();
arrayList.add(array1);
arrayList.add(array2);
notifyDataSetChanged();

আশা করি এটি আপনার জন্য অর্থবোধ করে।


0

সিম্পল কার্সার অ্যাডাপ্টার ব্যবহার করার সময় অ্যাডাপ্টারে চেঞ্জকার্সার (নতুন কার্সার) কল করতে পারেন।


0

আমি একই ছিলাম যখন কোনও খণ্ডে, আমি কিছু সময়ের মধ্যে স্ক্যান করা বিএলই ডিভাইসের ম্যাক ঠিকানা সহ একটি তালিকাভিউ (একক পাঠ্য ভিউতে) পপুলেশন করতে চেয়েছিলাম।

আমি যা করেছি তা হ'ল:

public class Fragment01 extends android.support.v4.app.Fragment implements ...
{
    private ListView                listView;
    private ArrayAdapter<String>    arrayAdapter_string;

...

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    ...
    this.listView= (ListView) super.getActivity().findViewById(R.id.fragment01_listView);
    ...
    this.arrayAdapter_string= new ArrayAdapter<String>(super.getActivity(), R.layout.dispositivo_ble_item, R.id.fragment01_item_textView_titulo);
    this.listView.setAdapter(this.arrayAdapter_string);
}


@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
{
    ...
    super.getActivity().runOnUiThread(new RefreshListView(device));
}


private class RefreshListView implements Runnable
{
    private BluetoothDevice bluetoothDevice;

    public RefreshListView(BluetoothDevice bluetoothDevice)
    {
        this.bluetoothDevice= bluetoothDevice;
    }

    @Override
    public void run()
    {
        Fragment01.this.arrayAdapter_string.add(new String(bluetoothDevice.toString()));
        Fragment01.this.arrayAdapter_string.notifyDataSetChanged();
    }
}

তারপরে তালিকাগুলি খুঁজে পাওয়া ডিভাইসের ম্যাক ঠিকানাটি গতিশীলভাবে পপুলেশন করতে শুরু করে।


0

আমি মনে করি এটি রিফ্রেশ দ্বারা আপনি কী বোঝাতে চাইছেন তার উপর নির্ভর করে। আপনি কী বোঝাতে চেয়েছেন যে জিইউআই প্রদর্শনটি রিফ্রেশ হওয়া উচিত, বা আপনার অর্থ শিশুটির দৃষ্টিভঙ্গিগুলি এমনভাবে সতেজ হওয়া উচিত যাতে আপনি প্রগতিগতভাবে getChildAt (ইন্ট) কল করতে পারেন এবং অ্যাডাপ্টারে যা আছে তার সাথে মিলিয়ে ভিউটি পেতে পারেন।

আপনি যদি জিইউআই প্রদর্শনটি রিফ্রেশ করতে চান তবে অ্যাডাপ্টারে নোটিফাইড ডেটাসেট চেঞ্জড () কল করুন। জিইউআই রিফ্রেশ হবে যখন পরবর্তী পুনর্নির্মাণ হবে।

আপনি যদি getChildAt (ইনট) কল করতে এবং অ্যাডাপ্টারে যা রয়েছে তার প্রতিফলন করে এমন একটি ভিউ পেতে সক্ষম হতে চান, তবে লেআউটচিলড্রেন () এ কল করুন। এটি অ্যাডাপ্টার ডেটা থেকে শিশু দর্শনটি পুনর্গঠন করবে।


0

আমার একটি অ্যারেলিস্ট ছিল যা আমি একটি তালিকাভিউতে প্রদর্শন করতে চাই। অ্যারেলিস্টে মাইএসকিএল থেকে উপাদান রয়েছে। আমি রিফ্রেশ পদ্ধতিতে ওভাররাইড করেছি এবং সেই পদ্ধতিতে আমি টেবিলআউটটি ব্যবহার করেছি remআরমেভএলভিউস (); এবং তারপরে ডাটাবেস থেকে আবার ডেটা পাওয়ার প্রক্রিয়াটি পুনরাবৃত্তি করলেন। তবে তার আগে আপনার অ্যারেলিস্ট বা যে কোনও ডেটা স্ট্রাকচার বা অন্য কোনও ডেটা পুরানোটির সাথে সংযুক্ত হয়ে যাবে তা পরিষ্কার করার বিষয়টি নিশ্চিত করুন ..


0

আপনি যদি কোনও পরিষেবা থেকে ইউআই তালিকাভিউ আপডেট করতে চান তবে আপনার মূল ক্রিয়াকলাপে অ্যাডাপ্টারটি স্থিতিশীল করুন এবং এটি করুন:

@Override
public void onDestroy() {
    if (MainActivity.isInFront == true) {
        if (MainActivity.adapter != null) {
            MainActivity.adapter.notifyDataSetChanged();
        }

        MainActivity.listView.setAdapter(MainActivity.adapter);
    }
}    

0

আপনি যদি অ্যান্ড্রয়েড গাইড লাইনগুলি দিয়ে যাচ্ছেন এবং আপনি ContentProvidersতথ্যটি ব্যবহার করতে ব্যবহার করছেন এবং আপনি এটি ব্যবহার করে Databaseপ্রদর্শন ListViewকরছেন CursorLoaderএবং CursorAdaptersতারপরে আপনার সম্পর্কিত ডেটাতে সমস্ত পরিবর্তন স্বয়ংক্রিয়ভাবে তালিকাভিউতে প্রতিফলিত হবে।

আপনার getContext().getContentResolver().notifyChange(uri, null);কার্সারে ContentProviderথাকা পরিবর্তনগুলি প্রতিফলিত করার জন্য যথেষ্ট। চারপাশে অতিরিক্ত কাজের প্রয়োজন নেই।

তবে আপনি যখন এই সমস্তগুলি ব্যবহার করছেন না তখন যখন ডেটাসেটটি পরিবর্তন হচ্ছে তখন আপনাকে অ্যাডাপ্টারটি বলতে হবে। এছাড়াও আপনার নিজের ডেটাসেটটি পুনরায় জনবহুল / পুনরায় লোড করতে হবে (বলুন তালিকা) এবং তারপরে আপনাকে notifyDataSetChanged()অ্যাডাপ্টারে কল করতে হবে ।

notifyDataSetChanged()ডেটসেটে কোনও পরিবর্তন না হলে কাজ করবে না। ডক্সে পদ্ধতির উপরে মন্তব্যটি এখানে দেওয়া হয়েছে-

/**
 * Notifies the attached observers that the underlying data has been changed
 * and any View reflecting the data set should refresh itself.
 */

0

আমি কেবলমাত্র নতুন অ্যাডাপ্টারের ডেটা পেয়ে, কেবলমাত্র তালিকার ভিউয়ের জন্য অ্যাডাপ্টারটি পুনরায় সেট করে, তারপরে কলটি করে: কেবলমাত্র ডেটাসেট চেঞ্জড করতে সক্ষম হয়েছি:

    expandableAdapter = baseFragmentParent.setupEXLVAdapter();
    baseFragmentParent.setAdapter(expandableAdapter);
    expandableAdapter.notifyDataSetChanged(); 

0

অন্য বিকল্পটি হল onWindowFocusChangedপদ্ধতি, তবে নিশ্চিত যে এটি সংবেদনশীল এবং যার জন্য আগ্রহী তাদের জন্য কিছু অতিরিক্ত কোডিং দরকার

 override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)

       // some controls needed
        programList = usersDBHelper.readProgram(model.title!!)
        notesAdapter = DailyAdapter(this, programList)
        notesAdapter.notifyDataSetChanged()
        listview_act_daily.adapter = notesAdapter
    }

0

আপনি আপনার অ্যাডাপ্টারের একটি তালিকা পাস করেছেন তা বিবেচনা করুন।
ব্যবহার করুন:

list.getAdapter().notifyDataSetChanged()

আপনার তালিকা আপডেট করতে।


0

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

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

সুতরাং, সমাধানটি ছিল অ্যাডাপ্টারের ক্লাস getViewপদ্ধতিতে অ্যাডাপ্টার থেকে অবজেক্টটি সরিয়ে ফেলা (কেবলমাত্র সেই নির্দিষ্ট অবজেক্টটি মুছতে তবে আপনি যদি সমস্ত মুছতে চান, কল করুন clear())।

কিছু ধারণা পেতে আপনার কাছে, আমার কোডটি দেখতে কেমন ছিল,

public class WordAdapter extends ArrayAdapter<Word> {
  Context context;

  public WordAdapter(Activity context, ArrayList<Word> words) {}
    //.......

    @NonNull
    @Override
    public View getView(final int position, View convertView, ViewGroup group) {
      //.......
     ImageButton deleteBt = listItemView.findViewById(R.id.word_delete_bt);
     deleteBt.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             if (vocabDb.deleteWord(currentWord.id)) {
                //.....
             } else{
                //.....
             }
             remove(getItem(position)); // <---- here is the trick ---<
             //clear() // if you want to clear everything
         }
    });
 //....

দ্রষ্টব্য: এখানে remove()এবং getItem()পদ্ধতিগুলি অ্যাডাপ্টার বর্গ থেকে উত্তরাধিকারসূত্রে প্রাপ্ত।

  • remove() - ক্লিক করা নির্দিষ্ট আইটেমটি সরাতে
  • getItem(position) - ক্লিক করা অবস্থান থেকে আইটেমটি পেতে (এখানে, আমার তালিকার সাথে যুক্ত হওয়া আমার ওয়ার্ড অবজেক্টটি রয়েছে)।

এইভাবে আমি অ্যাক্টিভিটি ক্লাসে তালিকা ভিউতে অ্যাডাপ্টার সেট করেছি,

    ArrayList<Word> wordList = new ArrayList();
    WordAdapter adapter = new WordAdapter(this, wordList);

    ListView list_view = (ListView) findViewById(R.id.activity_view_words);
    list_view.setAdapter(adapter);

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