【问题标题】:android listview with actionmode带有动作模式的android列表视图
【发布时间】:2013-01-09 04:49:01
【问题描述】:

在我的 android 应用程序中,有一个从 cursor(db) 填充的列表视图。它启用了多项选择,并且 actionbarsherlock 的动作模式对选定项目进行了操作。

我被困在这种情况下,

我从列表视图中选择了两个项目,操作模式说选择了两个项目。现在,如果我单击返回,则操作模式完成,但 checkitem 保持选中状态。记住 listview.getChildCount() 只会返回可见项目,如何取消选中所有后退键?

    private static SparseBooleanArray checkedItemsArray;

    @Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
        boolean isOneRowChecked = false;
    CheckableRelativeLayout r;
    checkedItemsArray = listView.getCheckedItemPositions();

    for (int i = 0; i < listView.getChildCount(); i++)
    {
        r = (CheckableRelativeLayout) listView.getChildAt(i);

        if (r != null && r.isChecked())
        {
            r.setBackgroundColor(Color.DKGRAY);
            isOneRowChecked = true;
        } else
        {
            r.setBackgroundColor(Color.BLACK);
        }
    }
    mActionMode = OtherActivity.this.startActionMode(mActionModeCallback);

    if (!isOneRowChecked && mActionMode != null)
    {
        mActionMode.finish();
        checkedItemsArray = null;
    }

}

我的activity也在实现OnScrollListener,所以

    @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
    int i = firstVisibleItem;
    if (checkedItemsArray != null)
    {
        for (int k = 0; k < visibleItemCount; k++)
        {

            CheckableRelativeLayout r = (CheckableRelativeLayout) listView.getChildAt(k);
            if (checkedItemsArray.get(i))
            {
                r.setChecked(true);
                r.setBackgroundColor(Color.DKGRAY);
            } else
            {
                r.setChecked(false);
                r.setBackgroundColor(Color.BLACK);
            }
            i++;
        }
    }
    else
    {
        for (int k = 0; k < visibleItemCount; k++)
        {
            listView.setItemChecked(k, false);
            CheckableRelativeLayout r = (CheckableRelativeLayout) listView.getChildAt(k);
            r.setChecked(false);
            r.setBackgroundColor(Color.BLACK);
        }
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    我建议你在 onDestroyActionMode 中这样做:

    public void onDestroyActionMode(ActionMode mode) {
      listView.clearChoices();
      for (int i = 0; i < listView.getChildCount(); i++) {
        ((Checkable) listView.getChildAt(i)).setChecked(false);
      }
      listView.setChoiceMode(ListView.CHOICE_MODE_NONE);
    
    }
    

    【讨论】:

    • 但是每次列表视图选择改变时都会调用 onDestroyActionMode ??
    • onDestroyActionMode 在动作模式即将退出和销毁时调用,因此只需确保在 onCreateActionMode 中调用 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多