1

カスタムの SimpleOnGestureListener を使用して長押しとシングルタップを検出し、それをセレクターを持つ ListView に実装しています。

ここで、リスト内のアイテムが長押しされたときにコンテキスト アクション モードを開始します。その後、singleTapUp を呼び出すたびに、選択したアイテムのセットにアイテム インデックスを追加します。また、非常に初歩的なセットを使用してトグル ロジックを実装しました。

切り替え中に、そのインデックスが、呼び出しから取得したスパースブール配列のブール値にマップされているかどうかも確認します

getCheckedItemPositions() 

リストビューで。インデックスが選択したアイテムにない場合は、追加して呼び出します

listView.setItemChecked(index, true)

それ以外の場合は、セットから削除して呼び出します

listView.setItemChecked(index, false)

今私の問題は、長押ししたときにアクションモードのコールバックを開始する最初のアイテムがアクティブ化された背景を保持しないのに対し、その後にクリックするすべてのアイテムが保持されることです。

また、電話しないと

setItemChecked() 

明示的に、アクティブな背景を保持するにはすべてのアイテムを長押しする必要があり、アイテムを1回クリックしても背景は変更されません。

誰かが私が達成したいことをするためのクリーンなアプローチを理解するのを手伝ってくれますか? どんな助けでも大歓迎です。

これが私が使用しているセレクターです --->

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_activated="true"
        android:drawable="@drawable/blue_highlight"/>

    <item android:state_activated="false"
        android:drawable="@drawable/plank_idle"/>

</selector>
4

2 に答える 2

0

子アイテムのルート レイアウトをフレーム レイアウトとして取得し、そのプロパティを次のように設定します。

android:foreground="?android:attr/activatedBackgroundIndicator"

それは私にとってf9の仕事です

于 2015-03-31T12:41:36.000 に答える
0

さて、最後に、多くのヘッドスクラッチが悪い設計のケースであることが判明したので、他の誰かが誤ってこれを間違っている場合に備えて、回答を投稿すると思いました.

私は、onSingleTapUp() や onLongPress() などの基本的なイベントを検出するために SimpleOnGestureListener を使用すべきではありませんでした。

これらのリスナーを使用すると、状態は AdapterView によって効果的に処理され、問題は発生しません。

于 2015-03-31T16:45:45.640 に答える