質問

テーブルレイアウトを使用してデータを表示していますが、リストアイテムのように動作したい(選択する能力、[背景]を選択するとき、クリックするとき、ホバーエフェクトを持つ、クリックできる)を使用しています。

  • OnClickListener(to perform action)
  • OnFocusChangeListener(To change background color)
  • OnTouchListener(to focus specific row)

現在の問題は、ユーザーがアイテムをタッチすると最初にフォーカスが取得され、次にもう一度タッチしてonclickイベントを起動する必要があることです。これを修正するために変更を加え、ontouchは行に固有のアクションを起動します。

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() != MotionEvent.ACTION_UP){
        v.requestFocus();
        int viewId= v.getId();
        handleEvent(viewId);//Switch cases to perform row specific actions.
    }
    return false;
}

これで、ユーザーが行にタッチするとイベントが発生し、完璧に機能しますが、ユーザーでも画面上に指をドラッグしてデータを下にスクロールしたい場合、ここでもう 1 つ問題が発生します。 ontouch イベントがクビになる....ユーザーがそう思っているにもかかわらず自動的に実行されるアクション scroll down スクリーン。

役に立ちましたか?

解決

この解決策があなたのケースに適用できるかどうかはわかりませんが、次のようにできるかもしれません。ユーザーが項目をクリックしたと仮定します (したがって、おそらく 3 つのイベントのシーケンスが OnTouch() メソッドに取得されることになります。ACTION_DOWN、ACTION_MOVE (必ずしも必要ではありません)、および ACTION_UP。これで、それに応じて反応できるようになります。

  1. ACTION_DOWN の場合、x 座標と y 座標を保存できます。
  2. ACTION_MOVE の場合は、その x と y を取得し、対応する ACTION_DOWN からの距離を計算します。想定される値よりも長い場合は、スクロールを実行し、項目がスクロールされたことを示すフラグを設定します。
  3. ACTION_UP の場合はフラグを確認してください。項目がスクロールされなかった場合は、アクションを起動してフラグをクリアします。

おそらく計算は高速である必要があるため、ACTION_MOVE イベントで行うべきことではありませんが、試してみてください。
よろしく!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top