notifyDataSetChanged example

后端 未结 5 923
再見小時候
再見小時候 2020-11-21 07:28

I\'m trying to use in my Android Application the notifyDataSetChanged() method for an ArrayAdapter but it doesn\'t work for me.

相关标签:
5条回答
  • 2020-11-21 08:00

    You can use the runOnUiThread() method as follows. If you're not using a ListActivity, just adapt the code to get a reference to your ArrayAdapter.

    final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
    runOnUiThread(new Runnable() {
        public void run() {
            adapter.notifyDataSetChanged();
        }
    });
    
    0 讨论(0)
  • 2020-11-21 08:05

    I recently wrote on this topic, though this post it old, I thought it will be helpful to someone who wants to know how to implement BaseAdapter.notifyDataSetChanged() step by step and in a correct way.

    Please follow How to correctly implement BaseAdapter.notifyDataSetChanged() in Android or the newer blog BaseAdapter.notifyDataSetChanged().

    0 讨论(0)
  • 2020-11-21 08:05

    I know this is a late response but I was facing a similar issue and I managed to solve it by using notifyDataSetChanged() in the right place.

    So my situation was as follows.

    I had to update a listview in an action bar tab (fragment) with contents returned from a completely different activity. Initially however, the listview would not reflect any changes. However, when I clicked another tab and then returned to the desired tab,the listview would be updated with the correct content from the other activity. So to solve this I used notifyDataSetChanged() of the action bar adapter in the code of the activity which had to return the data.

    This is the code snippet which I used in the activity.

    @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).
        }
    }
    

    This activity would return some data to FragmentTab2 and it would directly update my listview in FragmentTab2.

    Hope someone finds this useful!

    0 讨论(0)
  • 2020-11-21 08:08

    For an ArrayAdapter, notifyDataSetChanged only works if you use the add(), insert(), remove(), and clear() on the Adapter.

    When an ArrayAdapter is constructed, it holds the reference for the List that was passed in. If you were to pass in a List that was a member of an Activity, and change that Activity member later, the ArrayAdapter is still holding a reference to the original List. The Adapter does not know you changed the List in the Activity.

    Your choices are:

    1. Use the functions of the ArrayAdapter to modify the underlying List (add(), insert(), remove(), clear(), etc.)
    2. Re-create the ArrayAdapter with the new List data. (Uses a lot of resources and garbage collection.)
    3. Create your own class derived from BaseAdapter and ListAdapter that allows changing of the underlying List data structure.
    4. Use the notifyDataSetChanged() every time the list is updated. To call it on the UI-Thread, use the runOnUiThread() of Activity. Then, notifyDataSetChanged() will work.
    0 讨论(0)
  • 2020-11-21 08:17

    I had the same problem and I prefer not to replace the entire ArrayAdapter with a new instance continuously. Thus I have the AdapterHelper do the heavy lifting somewhere else.

    Add this where you would normally (try to) call notify

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

    AdapterHelper class

    public class AdapterHelper {
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
            arrayAdapter.clear();
            for (Object object : listOfObject){
                arrayAdapter.add(object);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题