Listview MultichoiceModelListener为单击选择多个项目

Listview MultichoiceModelListener为单击选择多个项目,listview,android-cursoradapter,multichoiceitems,Listview,Android Cursoradapter,Multichoiceitems,我已经实现了MultiChoiceModelListener,它产生了一些奇怪的问题。。。我的单子上有12项。。。8个可见,4个在屏幕下方。。所以这4个是隐藏的。当我从8个可见的项目中长时间单击时…代码也会从隐藏视图中更改另一个项目的背景…rest函数正在工作。Plz帮助。。我被困在过去两天 MyCusrsorAdaptor customAdaptor; private Cursor mCursor; private ListView lv01; View view; int itemsSele

我已经实现了MultiChoiceModelListener,它产生了一些奇怪的问题。。。我的单子上有12项。。。8个可见,4个在屏幕下方。。所以这4个是隐藏的。当我从8个可见的项目中长时间单击时…代码也会从隐藏视图中更改另一个项目的背景…rest函数正在工作。Plz帮助。。我被困在过去两天

MyCusrsorAdaptor customAdaptor;
private Cursor mCursor;
private ListView lv01;
View view;
int itemsSelectedCount=0;
SelectedItems = new SparseBooleanArray();

lv01.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

    lv01.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            itemsSelectedCount = toggleSelection(position, checked);
            mode.setTitle(itemsSelectedCount + " Messages Selected");

        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.menu_multichoice, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

            switch (item.getItemId()) {
                case R.id.delete_msg: {
                    DeleteSelectedRows();
                }
            }

            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {

            SelectedItems.clear();
            SelectedItems = new SparseBooleanArray();
            lv01.clearChoices();
            recreate();
        }
    });








}

private void DeleteSelectedRows()
{
    for(int k =0; k< SelectedItems.size();k++)
    {

        Cursor curitem = (Cursor) lv01.getItemAtPosition(SelectedItems.keyAt(k));
        String rowID = curitem.getString(curitem.getColumnIndex(dbHelper.COL_ROWID));
        String whereclause = dbHelper.COL_ROWID+"=?";
        db.delete(dbHelper.TABLE_NAME3,whereclause,new String[]{rowID});
        Log.d(TAG, "Delteted ROWID is --> "+rowID);
    }

    UpdateAlarms();
    recreate();

}

private int toggleSelection(int position, boolean checked)
{
    RelativeLayout relativeLayout = (RelativeLayout)lv01.getChildAt(position);

    if(checked==true)
    {   SelectedItems.put(position,checked);

        relativeLayout.setBackground(getResources().getDrawable(R.drawable.border_multichoice));
    }
    else{
        SelectedItems.delete(position);

        relativeLayout.setBackground(getResources().getDrawable(R.drawable.borderedittask));
    }
    return SelectedItems.size();
}

在谷歌搜索和尝试多种布局解决方案后……我终于找到了答案……但首先让我们了解问题及其原因:

原因:由于在滚动列表时循环使用ListView的视图,多个列表项被高亮显示(选择工作正常/高亮显示和选中是不同的事情)。在滚动时重新使用高亮显示的视图,因此下一个可见视图也被高亮显示

解决方案:只需在style.xml中添加一个样式

<style name="activated" parent="AppTheme">
    <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
</style>
如果要覆盖默认选择颜色,还可以通过定义新样式(包括“可绘制为激活模式”)来实现

我唯一需要删除的就是自定义边框,这样才能正常工作。rest所有代码保持不变


感谢乔纳森727泰铢,感谢他的时间和努力。非常感谢。

@All..如果需要更多的代码,请询问…因此您正在更改一个项目的背景,然后在将其他项目滚动到视图中后发现背景已更改?只是想澄清你的问题。@Jonathan:是的,你完全正确……请发布适配器的代码。您正在覆盖getview吗?@Jonathan727:您好…为延迟道歉…我正在使用自定义游标适配器..代码已发布供您参考。。我感谢你的帮助。
<style name="activated" parent="AppTheme">
    <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
</style>
style="@style/activated"