滚动时,在Android ListView中选择了多个项目

时间:2017-03-08 11:10:52

标签: android listview

我有一个ListView,我已对其进行了修改,因此当您按下列表项时,列表项背景颜色会更改,列表焦点将以项目为中心。一切都按预期工作,没有问题。

但是,如果您滚动列表,那么您将找到另一个列表项,其背景已更改,另一个列表项已更改,另一个列表项周期性更改。根据我的理解,ListView中的项目正在被回收,这就是发生这种情况的原因。

例如,在您需要滚动之前,我的列表包含12个可以在屏幕上显示的项目。如果您选择第一个项目,那么当您在实际设备上滚动列表时,第15个元素也将更改其背景。

有没有人知道如何解决这个问题,例如只有一个项目的背景改变而不是这个重复模式的其他“选定项目”?

以下是代码:

@Override
        public void onItemClick(final AdapterView<?> parent, final View view, final int position, long id) {
            //this deselects the previously selected item (changes its background to the default one)
            if(listItemPosition!=null) {
                previouslySelected = vehicleListArrayAdapter.getView(listItemPosition,previousView,parent);
                previouslySelected.setBackgroundColor(getResources().getColor(R.color.applicationBackground));
            }
            //verify if the pressed item has been set as itemPosition and if not, set it
            if (listItemPosition == null || listItemPosition != position){
                listItemPosition = position;
                previousView = vehicleListArrayAdapter.getView(position,view,parent);
            }
            //set the selection to the listItemPosition (if we subtract 5, we set the focus on the center of the ListView)
            realTimeVehicleListView.setSelection(listItemPosition-5);
            //focus the list on that item
            realTimeVehicleListView.requestFocus();
            //change the background color of the selected item to emphasize it
            currentlySelectedListItem = vehicleListArrayAdapter.getView(listItemPosition,view,parent);
            currentlySelectedListItem.setBackgroundColor(getResources().getColor(R.color.selectedItem));

这是一些尝试使用标志的代码:

@Override
        public void onItemClick(final AdapterView<?> parent, final View view, final int position, long id) {
            vehicleListItemSelected = true;
            //this deselects the previously selected item (changes its background to the default one)
            if(listItemPosition!=null) {
                previouslySelected = vehicleListArrayAdapter.getView(listItemPosition,previousView,parent);
                previouslySelected.setBackgroundColor(getResources().getColor(R.color.applicationBackground));
            }
            //verify if the pressed item has been set as itemPosition and if not, set it
            if (listItemPosition == null || listItemPosition != position){
                listItemPosition = position;
                previousView = vehicleListArrayAdapter.getView(position,view,parent);
            }
            //set the selection to the listItemPosition (if we subtract 5, we set the focus on the center of the ListView)
            realTimeVehicleListView.setSelection(listItemPosition-5);
            //focus the list on that item
            realTimeVehicleListView.requestFocus();
            //change the background color of the selected item to emphasize it
            if (vehicleListItemSelected){
                currentlySelectedListItem = vehicleListArrayAdapter.getView(listItemPosition,view,parent);
                currentlySelectedListItem.setBackgroundColor(getResources().getColor(R.color.selectedItem));
                vehicleListArrayAdapter.notifyDataSetChanged();
                vehicleListItemSelected = false;
            }
编辑:这比我原先想象的还要糟糕。如果您选择第一个项目,其背景将更改,然后您随机滚动列表并返回到第一个项目,它不再被选中。相反,选择了其他一些项目,可能是第二项或第三项,它的背景已更改而不是第一项,实际上是您选择的。

1 个答案:

答案 0 :(得分:0)

将变量传递给适配器,说明它是否被选中。 在每个元素的选择为false的开始集合中,然后在用户单击列表中的项目时。将适配器中使用的列表中的该位置的布尔值设置为true。这样可以防止回收。

每次选择一个项目并传递true变量时,请记住在适配器上使用notifyDatastChanged