15

ばかげた小さな問題があります。を独自のListFragmentとして登録しました。OnItemClickListenerOnItemLongClickListenerListView

イベントが呼び出されると、onItemClickそのアイテムの詳細ビュー アクティビティのインテントが開始されますが、問題はありません。

イベントが発生したらonItemLongClick、次のことを達成したいと考えています。

  • CAB を作成する
  • 長押しした項目を選択したままにする

コード:

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    if(this.cabMode != null)
        return false;
    this.cabMode = getActivity().startActionMode(editModeCallback);
    view.setSelected(true);
    return true;
}

CAB は表示されますが、選択はアイテムにとどまりません。

view.requestFocusFromTouch()関連する場合のいくつかの断片: への呼び出しまたは を使用してこの問題を修正することについて読んだことがありますlistView.setItemChecked()が、それは私にとってはうまくいきませんでした。また、リスト アイテムのビューはカスタム レイアウトからインスタンス化されますが、カスタム イベント リスナーはアタッチされていません。

どんな助けでも大歓迎です。どうも!

4

2 に答える 2

8

可能ですが、かろうじて...こんなに単純なことがどうしてこんなにばかげて複雑になるのか、私にはわかりません。

答えの鍵はここにあります:Android:ListViewを選択した後も青い背景を維持する

つまり、によって使用される追加のスタイルを定義しListView、選択モードをに設定することですAbsListView.CHOICE_MODE_SINGLE(リンクされた回答で説明されています)。

これにより、を使用してプログラムで選択を切り替えることができますListview.setItemChecked()onItemLongClickただし、コールバックでタッチされたアイテムのインデックスを自分で追跡する必要があります。これListView.setSelection()は行わないためです(少なくともListView.getSelectedItem()、私が見る限り、常に-1を返します)。

コード(簡単にするために、私のフラグメントは3つすべて、、、およびを実装しOnItemClickListenerますOnItemLongClickListenerActionMode.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がアクティブなときに、通常はアイテムに関連付けられているアクション(詳細ビューを開くなど)が誤ってトリガーされないようにすることができます。

于 2013-02-27T12:35:01.763 に答える