可能ですが、かろうじて...こんなに単純なことがどうしてこんなにばかげて複雑になるのか、私にはわかりません。
答えの鍵はここにあります:Android:ListViewを選択した後も青い背景を維持する
つまり、によって使用される追加のスタイルを定義しListView
、選択モードをに設定することですAbsListView.CHOICE_MODE_SINGLE
(リンクされた回答で説明されています)。
これにより、を使用してプログラムで選択を切り替えることができますListview.setItemChecked()
。onItemLongClick
ただし、コールバックでタッチされたアイテムのインデックスを自分で追跡する必要があります。これListView.setSelection()
は行わないためです(少なくともListView.getSelectedItem()
、私が見る限り、常に-1を返します)。
コード(簡単にするために、私のフラグメントは3つすべて、、、およびを実装しOnItemClickListener
ますOnItemLongClickListener
)
ActionMode.Callback
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
this.listViewAdapter = new ListViewAdapter();
this.root = (ListView)inflater.inflate(R.layout.fragment_bookmarks, container, false);
this.root.setAdapter(this.listViewAdapter);
this.root.setOnItemClickListener(this);
this.root.setOnItemLongClickListener(this);
this.root.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
return this.root;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if(this.cabMode != null)
return false;
this.selectedPosition = position;
this.root.setItemChecked(position, true);
this.root.setOnItemClickListener(null);
this.cabMode = getActivity().startActionMode(this);
return true;
}
そして最後に、CABが閉じているときに選択を削除したい場合は、次のようにします。
@Override
public void onDestroyActionMode(ActionMode mode) {
cabMode = null;
this.root.setItemChecked(this.selectedPosition, false);
this.selectedPosition = -1;
this.root.setOnItemClickListener(this);
}
登録と登録解除OnItemClickListener
により、CABがアクティブなときに、通常はアイテムに関連付けられているアクション(詳細ビューを開くなど)が誤ってトリガーされないようにすることができます。