我有android应用程序,它使用listview和自定义对象的适配器。
onCreate of activity如果对象列表可用,我使用以前的对象填充适配器并进行异步调用以获取新对象并填充适配器。
再次填充适配器时,将删除旧的元素列表,并添加新元素。我没有使用notifyDataSetChanged()。
private CustomAdapter listAdapter;
private GridView gridView;
// this is onCreateView of fragment if i find old list in singleton i populate list and it shows on screen
function onCreateView()
{
...
...
listAdapter = new CustomAdapter(getActivity(),
CounterSingleton.getInstance(getActivity())
.getObjects());
gridView.setAdapter(listAdapter);
....
...
new AsnycTask().execute();
}
class AsnycTask
{
// fetch new list and replace old list shown
List<Objects> newList = fetchNewList();
listAdapter = new CustomAdapter(
getActivity(), newList);
gridView.setAdapter(listAdapter);
}
这里几乎没有问题:
在我通过创建新实例来填充适配器后,我是否需要在AsnycTask类中使用notifyDataSetChanged()。
将删除旧列表,并按照上述代码替换为新列表。
答案 0 :(得分:2)
我需要在i之后在AsnycTask类中使用notifyDataSetChanged() 通过创建它的新实例来填充适配器。
无需致电notifyDataSetChanged()
因为当前正在使用新数据源为ListView调用setAdapter
方法
根据上述代码,旧列表将被删除并替换为新列表。
是ListView将填充新数据。
注意:而不是再次调用setAdapter
方法 - 2来显示新数据。在Adapter中创建一个方法,它将用新数据更新当前的Adapter.like:
public void addNewItems(List<Objects> itemList){
1. clear data from current adapter
for example if using ArrayList then
ArrayList_Object.clearAll();
2. Add itemList in ArrayList_Object
ArrayList_Object.addAll(itemList);
3. Call this.notifyDataSetChanged()
}
现在使用第一次填充ListView时创建的相同对象,从addNewItems
调用AsnycTask
更新当前apdater数据:
listAdapter.addNewItems(newList)