仅在某些手机中,ListView在notifyDataSetChanged()之后不刷新

tim*_*yau 18 android listview android-listview

这是因为它仅在某些手机中发生,因为它们的分辨率是FHD.

当显示UI时,一切似乎都可以.当我单击项目并调用notifyDataSetChanged()时,item不会刷新它的外观.我需要再次点击ListView,项目将刷新布局到正确的外观.

如果listview改变大小(例如:搜索功能将重新设计整个布局),一切都会变好.

这是ListView代码:

public final class MyListView extends ListView implements AdapterView.OnItemClickListener
{

    ArrayList<SELECT_ITEM> selectList;
    ArrayList<ID_ITEM> idList;
    ShowItemAdapter showAdapter;

    public MyListView(Context context) 
    {
        selectList = new ArrayList<SELECT_ITEM>();
        idList = new ArrayList<ID_ITEM>();

        readIdList(mIdList);
        showAdapter = new ShowItemAdapter(context, idList, selectList);
        setAdapter(showAdapter);        

        ...
    }

    @Override
    protected void onFinishInflate() {
        setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long ID) {
        boolean itemIsSelected = true;
        int size = selectList.size();

        // remove if click item in selectList
        for(int i=0 ; i<size ; i++) {
            int selectID = selectList.get(i).id;
            if (idList.get(position).id == selectID) {  
                itemIsSelected = false;
                selectList.remove(i);
                showAdapter.notifyDataSetChanged();
                break;
            }
        }

        if (itemIsSelected) {
            SELECT_ITEM item = new SELECT_ITEM();
            item.id = idList.get(position);
            selectList.add(item);
            // Here
            showAdapter.notifyDataSetChanged();
        }
    ...
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)

这是适配器代码,

    public final class ShowItemAdapter extends BaseAdapter{

    public ArrayList<ID_ITEM>   mIdList;
    public ArrayList<SELECT_ITEM>   mSelectList;

    public ShowItemAdapter(Context context,
        ArrayList<ID_ITEM> idList,
        ArrayList<SELECT_ITEM> selectList)
    {
        mIdList = idList;
        mSelectList = selectList;
    }

    @Override
    public int getCount() {
        int ret = mIdList.size();
        return ret;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ...

        for(int i=0 ; i<size ; i++)
        {
            // is selected
            if (mIdList.get(position).id == 
                selectList.get(i).id)
            {
                mIsSelected = true;
                break;
            }
        }

        if (mIsSelected)
        {
            textView.setBackgroundColor(Color.red);
        }
        else
        {
            textView.setBackgroundColor(Color.white);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有人帮我一把吗?

我发现在getView()调试暂停时,这些手机正常工作会导致同样的问题.我认为......就像"视图已经更新,所以它不会刷新视图." 但是在调试期间更新视图会使ui实际上不刷新,然后它以错误的方式工作.

我想这是关于令人耳目一新的观点.

tim*_*yau -1

我找到了一个解决方案,尽管它仍然可以解决一些问题。
我在 Activity.onCreate() 中调用下面的方法,并且只有在 onInit() 中 MyListView 才会被初始化:

    postDelayed(new Runnable()
    {
        public void run()
        {
            onInit(icicle); // initial ui
        }
    }, 100);
Run Code Online (Sandbox Code Playgroud)

它使视图显示速度变慢但工作正常。
如果延迟100毫秒左右,可能会导致那些工作正常的手机变成坏手机。大约350毫秒的延迟使得两款手机都运行良好。有更好的答案吗?