在我更新列表视图中所选项目的背景颜色后,如果我滚动背景更改为随机项目并且它也选择了多个项目,为啥?

Posted

技术标签:

【中文标题】在我更新列表视图中所选项目的背景颜色后,如果我滚动背景更改为随机项目并且它也选择了多个项目,为啥?【英文标题】:After i update background color of selected item in listview, if i scroll background changes to random item and it selects multiple items too, why?在我更新列表视图中所选项目的背景颜色后,如果我滚动背景更改为随机项目并且它也选择了多个项目,为什么? 【发布时间】:2019-01-21 10:54:54 【问题描述】:

我的代码:

ArrayList<Integer> selectedItemIds = new ArrayList<>();
boolean isItemSelected = false;

    main_listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
         @Override
         public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 

             Object object = parent.getItemAtPosition(position);

             if(object instanceof Listview_Item_Details)
             
                 TextView itemName = (TextView) view.findViewById(R.id.listview_itemName);
                 TextView itemDetails = (TextView) findViewById(R.id.listview_itemDetails);


                 if(!selectedItemIds.isEmpty())
                 
                     for(int i = 0; i < selectedItemIds.size();i++)
                     
                         if(selectedItemIds.get(i) == position)
                         
                             isItemSelected = true;
                             if(selectedItemIds.size() == 1)
                             
                                 selectedItemIds.clear();
                             
                             else
                             
                                 selectedItemIds.remove(i);
                             
                         
                     

                     if(isItemSelected)
                     
                         view.findViewById(R.id.custom_listview_item).setBackgroundResource(R.drawable.listview_item_background);
                         itemName.setTextColor(getResources().getColor(R.color.colorBlack));
                         itemDetails.setTextColor(getResources().getColor(R.color.colorGray_Dark));
                         isItemSelected = false;
                     
                     else
                     
                         selectedItemIds.add(position);
                         view.findViewById(R.id.custom_listview_item).setBackgroundResource(R.drawable.listview_selected_item_background);
                         itemName.setTextColor(getResources().getColor(R.color.colorWhite));
                         itemDetails.setTextColor(getResources().getColor(R.color.colorPrimaryDark));

                     
                 
                 else
                 
                     selectedItemIds.add(position);
                     view.findViewById(R.id.custom_listview_item).setBackgroundResource(R.drawable.listview_selected_item_background);
                     itemName.setTextColor(getResources().getColor(R.color.colorWhite));
                     itemDetails.setTextColor(getResources().getColor(R.color.colorPrimaryDark));
                 
             

             return true;
         
     );

注意:“custom_listview_item”是item的自定义布局的RelativeLayout,两个textview都在其中。

现在一切正常,但就像我在问题中所说的那样,如果我不滚动列表视图并选择/取消选择多个项目,它可以工作,但我滚动它会随机更改多个项目的背景,甚至更改所选项目的背景。

这里有什么问题?

【问题讨论】:

不要更改 ItemClick 内的项目视图属性。在适配器的getView() 内执行此操作。在ItemClick 中仅对数据集进行更改并通知适配器。 Recyclerview 重复使用他的所有单元格以提高性能,您必须将原始背景颜色明确设置为未点击的单元格。 @ADM 你的意思是创建覆盖适配器getView的方法? 【参考方案1】:

使用Recyclerview而不是Listview来处理这种情况并自定义视图项。

【讨论】:

以上是关于在我更新列表视图中所选项目的背景颜色后,如果我滚动背景更改为随机项目并且它也选择了多个项目,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

列表视图滚动更改项目视图的背景颜色(简单适配器)

ListView:如何从列表中访问视图以更改背景颜色?

按下按钮时更改列表视图背景颜色

隐藏 NavBar 但显示带背景的状态栏

如何在 Select 元素中设置所选项目的背景颜色?

如何自动更改 QListWidget 中所选项目的颜色