0

私のAndroidアプリには、カーソル(db)から取り込まれるリストビューがあります。複数の選択肢が有効になっており、選択したアイテムに対するアクションを含む actionbarsherlock のアクションモードがあります。

私はこのシナリオで立ち往生しています、

リストビューから 2 つの項目を選択すると、アクション モードで 2 つの項目が選択されたと表示されます。ここでクリックして戻ると、アクション モードは終了しますが、checkeditem はチェックされたままになります。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;
    }

}

私のアクティビティも 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);
        }
    }
}
4

1 に答える 1

0

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);

}
于 2013-01-08T20:49:01.007 に答える