Android ListView notifyDatasetChanged不刷新视图

Android ListView notifyDatasetChanged不刷新视图,android,listview,Android,Listview,在我的应用程序中,我试图通过 adater.notifyDataSetChanged(); 但它不起作用 我知道人们遇到过这样的问题: 但是我试过那种方法,它对我不起作用 这是我的核心代码(我试图在抽屉打开后刷新视图): public类DrawerItem{ 私有字符串名称; 私有整数图标=-1; 专用字符串计数器=“0”; 专用布尔显示计数器; 私有ItemType ItemType; 公共抽屉属性(字符串名称、int图标、ItemType ItemType、布尔显示计数器){ this.n

在我的应用程序中,我试图通过

adater.notifyDataSetChanged();
但它不起作用

我知道人们遇到过这样的问题:

但是我试过那种方法,它对我不起作用

这是我的核心代码(我试图在抽屉打开后刷新视图):

public类DrawerItem{
私有字符串名称;
私有整数图标=-1;
专用字符串计数器=“0”;
专用布尔显示计数器;
私有ItemType ItemType;
公共抽屉属性(字符串名称、int图标、ItemType ItemType、布尔显示计数器){
this.name=名称;
this.icon=图标;
this.showCounter=showCounter;
this.itemType=itemType;
}
//省略了getter和setter
公共枚举项类型{
动作、图层、标题
}
}
私有列表getDrawerItems(){
ArrayList items=新建ArrayList();
DroperItem层=新的DroperItem(“层”,-1,DroperItem.ItemType.Title,false);
DrawerItem layer01=新的DrawerItem(“layer01”,R.drawable.drawer_ic1,DrawerItem.ItemType.Action,false);
DrawerItem layer02=新的DrawerItem(“layer02”,R.drawable.drawer\u ic2,DrawerItem.ItemType.Action,true);
DrawerItem layer03=新的DrawerItem(“layer03”,R.drawable.drawer_ic3,DrawerItem.ItemType.Action,true);
DrawerItem layer04=新的DrawerItem(“layer04”,R.drawable.drawer_ic4,DrawerItem.ItemType.Action,false);
添加(图层);
添加项目(第01层);
添加项目(第02层);
添加项目(第03层);
添加项目(第04层);
如果(mLayerPoint2!=null){
layer02.setCounter(String.valueOf(mLayerPoint2.getFeatureCounter());
}
如果(mLayerPoint3!=null){
layer03.setCounter(String.valueOf(mLayerPoint3.getFeatureCounter());
}
退货项目;
}
私有类DrawerAdapter扩展ArrayAdapter{
private List mData=new ArrayList();
公共paureradapter(上下文,int资源){
超级(上下文、资源);
}
公共无效交换项(列表项){
这是.mData.clear();
this.mData.addAll(项目);
this.notifyDataSetChanged();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
付款人项目=getItem(位置);
if(convertView==null){
开关(item.getItemType()){
案例行动:
convertView=((LayoutFlater)getContext().getSystemService(Context.LAYOUT\u INFLATER\u SERVICE)).inflate(R.LAYOUT.drawer\u item\u action,null);
.....
打破
案例名称:
convertView=((LayoutFlater)getContext().getSystemService(Context.LAYOUT\u INFLATER\u SERVICE)).inflate(R.LAYOUT.drawer\u item\u title,null);
...
打破
}
}
返回视图;
}
}
创建时的公共无效(…){
mDrawerList=(ListView)findViewById(R.id.left\u抽屉);
mDrawerListAdapter=新抽屉定位器(此,R.layout.drawer\u item\u动作);
列表项=getDrawerItems();
mDrawerListAdapter.addAll(项目);
setAdapter(mDrawerListAdapter);
mDrawerToggle=new ActionBarDrawerToggle(这个,mDrawerLayout,R.drawable.ic_抽屉,R.string.app_名称,R.string.app_名称){
公共无效onDrawerClosed(视图){
}
打开图纸上的公共空白(视图抽屉视图){
mDrawerListAdapter.swapItems(getDrawerListItems());
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}

问题出在哪里?

问题出在您的swapItems上,您确实不需要显式调用notifyDataSetChanged。 如果您正在使用ArrayAdapter

因为当您向ArrayAdapter添加项目时,ListView将收到更改通知。 因此,您必须将该项添加到适配器

删除此行和DreamRadapter中的swapItems()方法

private List<DrawerItem> mData = new ArrayList<DrawerItem>();
就这些。。希望它对您有用

解决:

由于我使用了
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;
    }

你在哪里打电话给notifyDatasetchanged?请在类
DrawerAdapter
中发布该代码。是否发布适配器的完整代码?请尝试使列表视图无效。是的,适配器代码已完成。谢谢,我尝试过,但我发现该项的
计数器未更新。似乎没有再次调用
getView
。getDrawerItems()大小是否大于0?当然,您可以检查我的
getDrawerItems
方法,它将向列表中添加五项。尝试重写getCount(),看看调用的
getCount
是否被调用,然后返回五项。
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;
    }