[英]ListView notifyDatasetChanged does not refresh view
在我的應用程序中,我嘗試通過以下方式更新listview
adater.notifyDataSetChanged();
但這行不通。
我知道人們已經遇到過這樣的問題: notifyDataSetChanged后,Android ListView無法刷新
但是我嘗試過這種方法,但對我來說不起作用。
這是我的核心代碼(打開抽屜后,我試圖刷新視圖):
public class DrawerItem {
private String name;
private int icon = -1;
private String counter = "0";
private boolean showCounter;
private ItemType itemType;
public DrawerItem(String name, int icon, ItemType itemType, boolean showCounter) {
this.name = name;
this.icon = icon;
this.showCounter = showCounter;
this.itemType = itemType;
}
//getter and setter omitted
public enum ItemType {
Action, Layer, Title
}
}
private List<DrawerItem> getDrawerItems() {
ArrayList<DrawerItem> items = new ArrayList<DrawerItem>();
DrawerItem layer = new DrawerItem("Layer", -1, DrawerItem.ItemType.Title, false);
DrawerItem layer01 = new DrawerItem("Layer01", R.drawable.drawer_ic1, DrawerItem.ItemType.Action, false);
DrawerItem layer02 = new DrawerItem("Layer02", R.drawable.drawer_ic2, DrawerItem.ItemType.Action, true);
DrawerItem layer03 = new DrawerItem("Layer03", R.drawable.drawer_ic3, DrawerItem.ItemType.Action, true);
DrawerItem layer04 = new DrawerItem("Layer04", R.drawable.drawer_ic4, DrawerItem.ItemType.Action, false);
items.add(layer);
items.add(layer01);
items.add(layer02);
items.add(layer03);
items.add(layer04);
if (mLayerPoint2 != null) {
layer02.setCounter(String.valueOf(mLayerPoint2.getFeatureCounter()));
}
if (mLayerPoint3 != null) {
layer03.setCounter(String.valueOf(mLayerPoint3.getFeatureCounter()));
}
return items;
}
private class DrawerAdapter extends ArrayAdapter<DrawerItem> {
private List<DrawerItem> mData = new ArrayList<DrawerItem>();
public DrawerAdapter(Context context, int resource) {
super(context, resource);
}
public void swapItems(List<DrawerItem> items) {
this.mData.clear();
this.mData.addAll(items);
this.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
DrawerItem item = getItem(position);
if (convertView == null) {
switch (item.getItemType()) {
case Action:
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.drawer_item_action, null);
.....
break;
case Title:
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.drawer_item_title, null);
...
break;
}
}
return convertView;
}
}
public void onCreate(...){
mDrawerList = (ListView) findViewById(R.id.left_drawer);
mDrawerListAdapter = new DrawerAdapter(this, R.layout.drawer_item_action);
List<DrawerItem> items = getDrawerItems();
mDrawerListAdapter.addAll(items);
mDrawerList.setAdapter(mDrawerListAdapter);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.app_name, R.string.app_name) {
public void onDrawerClosed(View view) {
}
public void onDrawerOpened(View drawerView) {
mDrawerListAdapter.swapItems(getDrawerItems());
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
有什么問題?
解決了:
由我的DrawerAdapter
愚蠢的getView
方法引起的:
public View getView(int position, View convertView, ViewGroup parent) {
DrawerItem item = getItem(position);
if (convertView == null) {
switch (item.getItemType()) {
case Action:
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.drawer_item_action, null);
.....
break;
case Title:
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.drawer_item_title, null);
...
break;
}
}
return convertView;
}
修正為:
switch (item.getItemType()) {
case Action:
if (convertView == null) {
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.drawer_item_action, null);
}
....
break;
case Title:
if (convertView == null) {
convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.drawer_item_title, null);
}
....
break;
}
問題在於您swapItems,您實際上不需要顯式調用notifyDataSetChanged。 如果您使用ArrayAdapter。
因為當您向ArrayAdapter添加項目時,ListView會收到有關更改的通知。 因此,您必須將項目添加到適配器。
刪除此行和DrawerAdapter中的swapItems()方法。
private List<DrawerItem> mData = new ArrayList<DrawerItem>();
當需要刷新新項目時,請清除適配器中的現有項目,然后從onDrawerOpened()添加新項目。
因此,您的onDrawerOpened()需要進行如下更改
public void onDrawerOpened(View drawerView) {
// clear the existing items
mDrawerListAdapter.clear();
// add the new item
mDrawerListAdapter.addAll(getDrawerItems())
}
僅此而已..希望它對您有用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.