【问题标题】:Failing to update ListView even after calling notifyDataSetChanged()即使在调用 notifyDataSetChanged() 后也无法更新 ListView
【发布时间】:2015-06-14 21:42:44
【问题描述】:

代码很简单,我只是想看看如何用全新的数据更新列表视图。我将值存储在数组中并将其传递给数组适配器。单击列表视图项目时,我想清除现有的列表视图并添加一组新值并在列表视图中显示新项目。

我可以看到数组正在使用新值进行更新,但即使在调用 notifyDataSetChanged() 后这些值也不会显示。请看一下代码,并让我知道我在这里做错了什么。提前谢谢你。

public class MainActivity extends Activity {
   public ListView mListView;
   String[] stringArray;
   string[] stringArray1;
   String[] stringArray2;
   String[] stringArray3;
   String[] stringArray4;
   static int track=1;
   public ArrayAdapter<String> adapter;
   public ArrayList<String[]> aList;
   static Iterator<String[]> aitr;

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

    mListView=(ListView) findViewById(R.id.listView1);

    //stringArray= new String[4];
    stringArray1 = new String[]  {"Bright Mode1", "Normal Mode1","silly mode1", "dupe mode1","trail mode1"};
    stringArray2 = new String[] { "Bright Mode2", "Normal Mode2","silly mode2", "dupe mode2","trail mode2"};
    stringArray3 = new String[] { "Bright Mode3", "Normal Mode3","silly mode3", "dupe mode3","trail mode3"};
    stringArray4 = new String[] { "Bright Mode4", "Normal Mode4","silly mode4", "dupe mode4","trail mode4"};
    aList=new ArrayList<String[]>();
    aList.add(stringArray2);
    aList.add(stringArray3);
    aList.add(stringArray4);
    aitr=aList.iterator();

    stringArray=stringArray1;
    adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1, stringArray);
    mListView.setAdapter(adapter);
}

public void updateArray(){
    if(aitr.hasNext()){
        mListView.clearChoices();
        stringArray=aitr.next();
    }
}

@Override
protected void onStart(){
    super.onStart();
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            int a = view.getId();

            Log.e("devsample", "the is is: " + a + ", " + position + ", " + id);
            updateArray();
            adapter.notifyDataSetChanged() ;
        }
    });
}

}

【问题讨论】:

    标签: android listview android-listview android-arrayadapter


    【解决方案1】:

    updateArray() 方法中,您将新数组分配给您的stringArray,但您的adapter 仍然引用您的旧stringArray。 在您的updateArray() 末尾添加这两行以更新您的adapter

    adapter.clear();
    adapter.addAll(stringArray); // or if you're targeting Android < 11 call: adapter.add() in a loop
    

    【讨论】:

    • public void updateArray(){ if(aitr.hasNext()){ mListView.clearChoices(); stringArray=aitr.next();适配器.clear();适配器.addAll(stringArray); } }
    • 更新方法时出现以下异常: java.util.AbstractList.remove(AbstractList.java:638) at java.util.AbstractList$SimpleListIterator.remove( AbstractList.java:75) 在 java.util.AbstractList.removeRange(AbstractList.java:658)
    【解决方案2】:

    所以我结合了提问者的回答和 st0le 在这篇帖子中提供的解释 Unable to modify ArrayAdapter in ListView: UnsupportedOperationException

    解决了这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2020-09-12
      相关资源
      最近更新 更多