所以我在这里玩这个代码,主要目标是在点击按钮后用新项目更新列表。我的代码有效,但我不确定这是否是正确的方法。
我有两种方法。第一个方法接受我的ArrayList,添加两个字符串并将其发布到listview。大!
当我点击按钮时,我会调用第二种方法。它添加一个新的字符串并更新列表,但为了让我更新现有的listview,我不得不再次执行“setListAdapter(new ArrayAdapter ....”行,我不确定这是否正确做。
我可以使用一些输入,谢谢!
方法1:
static final List list = new ArrayList();
private void showEvents (Cursor cursor){
list.add("foo");
list.add("bar");
Log.d(TAG,"showevent");
setListAdapter(new ArrayAdapter<String>(this, R.layout.singleitem, list));
}
方法2(当我点击listView下的按钮时调用此方法):
private void updateListView(){
try{
list.add("son");
setListAdapter(new ArrayAdapter<String>(this, R.layout.singleitem, list));
}catch (Exception e){
Log.d(TAG, "E="+e);
}
}
答案 0 :(得分:2)
不要再次设置列表适配器,而是调用ArrayAdapter上的notifyDataSetChanged()。上面的“工作”,但它强制整个ListView重绘,所以如果你有一个很长的列表,用户已经滚动它将弹出它们回到顶部。通知是一种更简洁的方法。
非常简单的代码。在这种情况下,我在活动中引用了数组适配器:
adapter.notifyDataSetChanged();
以下是基于您的代码的示例:
static final List list = new ArrayList();
ArrayAdapter adapter;
private void showEvents (Cursor cursor){
list.add("foo");
list.add("bar");
Log.d(TAG,"showevent");
adapter = new ArrayAdapter<String>(this, R.layout.singleitem, list)
setListAdapter(adapter);
}
private void updateListView(){
try{
list.add("son");
adapter.nofityDataSetChanged();
// not needed anymore
//setListAdapter(new ArrayAdapter<String>(this, R.layout.singleitem, list));
}catch (Exception e){
Log.d(TAG, "E="+e);
}
}
答案 1 :(得分:0)
声明ArrayAdapter
的成员变量(比如myAdapter
),然后在showEvents
方法中初始化它并将其设置为listView。将字符串添加到列表后,在updateListView
方法中接下来只需调用myAdapter.notifyDataSetChanged();
,这应该可以解决问题