簡體   English   中英

ListView notifyDatasetChanged不刷新視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM