Android中刷新ListView适配器的正确方法
我有一份物品清单。我有一个按钮,可以将您发送到另一个活动,以便创建一个新项目。保存新项目时,一个意图会将您发送回活动,其中包含应添加新项目的列表。适配器从BaseAdapter扩展而来,没有过滤,它只是将数据设置为视图 我的代码是:Android中刷新ListView适配器的正确方法,android,listview,android-adapter,baseadapter,Android,Listview,Android Adapter,Baseadapter,我有一份物品清单。我有一个按钮,可以将您发送到另一个活动,以便创建一个新项目。保存新项目时,一个意图会将您发送回活动,其中包含应添加新项目的列表。适配器从BaseAdapter扩展而来,没有过滤,它只是将数据设置为视图 我的代码是: onCreate(){ ListView listView = findItemById...... listView.setListeners....... } onResume(){ data = getData(); adap
onCreate(){
ListView listView = findItemById......
listView.setListeners.......
}
onResume(){
data = getData();
adapter = new ListAdapter(context,data);
listView.setAdapter(adapter);
}
它是有效的,但这是正确的吗
我是否可以在onCreate中使用创建适配器和setAdapter,并仅在onResume中使用notifyDataSetChanged()。将此方法添加到适配器,然后使用
适配器使用新数据调用它。udpateData(数据)
:
另外,您可以使用notifyItemRangeInserted(0,data.size())我认为正确的方法是使用
startActivityForResult(...)
方法启动第二个活动(在其中添加新项目)
在你的第二个活动中使用
setResults(RESULT_OK or RESULT_CANCELLED)
(添加新项目或用户返回上一屏幕时的不同结果)
然后在ListAdapter类中添加方法
public void updateData(List data) {
this.data = new ArrayList<>(data);
notifyDataSetChanged();
}
我还强烈建议您使用RecyclerView而不是ListView
UPD:回答您的问题-我认为您的代码中最大的错误是在onResume()方法中创建ListAdapter对象的新实例,当不需要时Hi-OnActivity Result读取所有数据创建新对象并添加到列表并调用notifyDataSangeetchd(),我会自动刷新ui确定,您可以在
onCreate
中创建适配器,在那里调用setAdapter
并在onResume
中调用notifyDataSetChanged
,这取决于ListAdapter
的实现方式。。。fx:如果它扩展ArrayAdapter并使用筛选(从ArrayAdapter扩展而不是从BaseAdapter扩展的唯一原因),那么它可能不起作用,但如果您扩展BaseAdapter并直接使用传递的数据
引用,则是。。。请记住,如果执行data=getData()代码>它将不起作用,因为在此之后,数据
将是一个不同的引用,然后先前传递给适配器。您可能会发现这很有帮助:-以上是一种不好的做法吗?有点是一种不好的做法
,但是如果它起作用,那么不要担心。。。
public void updateData(List data) {
this.data = new ArrayList<>(data);
notifyDataSetChanged();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == YOUR_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
adapter.updateData(...your data from result Intent, or from anywhere else...);
}
}