1

私は現在、小さな Android モジュールに取り組んでおり、おそらく誰かが解決できる問題に直面しています。カレンダーを作成し、ユーザーが 1) 開始日をクリックして日付範囲を選択できるようにする必要があります (これにより、デフォルトで 2 日間の範囲が作成されます)。次に、2) 1 つの範囲の境界線に触れてドラッグし、それを増減させます。範囲

現在、 RecyclerView と GridLayoutManagerを使用して、行ごとに 7 つの項目 (日) を持つ多くの行 (すべての週) を持つすべてのカレンダー日セルを作成しました。次に、RecyclerView ItemTouchHelper ( https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.html )と ItemTouchHelper.Callback ( https://developer.android.com/ reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html )を使用して、ドラッグ & ドロップ機能を完成させます。私のアプローチは、これらのヘルパーが提供するドラッグ&ドロップ検出を使用することでした ( https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf#.ib8r012gcをご覧ください)。)1つのアイテムを移動せず、必要なタッチ+ドラッグ+ドロップジェスチャーのみを検出するように変更します。デフォルトのドラッグ アニメーションを削除し (ItemTouchHelper onDraw/onDrawOver をオーバーライド)、ItemTouchHelper.Callback コールバックを使用してドラッグの動きを管理することで (アダプター アイテムを常に同じ位置に配置する必要があるため、アダプター アイテムを交換せずに) 機能を正しく完了しました。すべて正常に動作しますが、ドラッグ検出が期待どおりに機能しないため、問題に直面しています。説明してみます:特定のセルの中心でドラッグ移動を開始し、その左側のセルに移動すると、中心に到達するまでドラッグ移動はトリガーされません。(ドラッグの動きを開始したのと同じ位置) 左のセルの。別のセルに到達したらすぐにドラッグを検出する必要があるため、これは問題です (指が新しいセルの境界内にある場合、ドラッグがトリガーされるはずです)。別の例として、セルの左端でドラッグを開始すると、別のセルの左端に到達するまでドラッグはトリガーされません。

、私は ItemTouchHelper.Callback.chooseDropTarget メソッドで少し遊んで、指が新しいセルに入るとすぐにドロップターゲットを手動で選択しようとしていますが、うまくいきません。受け取った x、y 座標が何かおかしいと思います (ただし、保証はできません)。

いくつかのコード例が非常に役立つことはわかっていますが、プライベートで保護されたリポジトリに属しているため、貼り付けることができません:(

誰でも私に提供できる助けは本当にありがたいです. そしてもちろん、私はできる限りの情報を提供するために、このトピックを保留しようとします. また、範囲の境界を移動するために必要な「タッチ+移動+上」の動きを得るために、新しいさまざまなアプローチと提案を考慮します:)

すべてのスタック オーバーフロー コミュニティに感謝します。

4

1 に答える 1

1

さらに調査した結果、問題の解決策が見つかりました。誰かが同じ問題に直面した場合、ここで助けを見つけることができるように投稿します:)

私の問題はcurX、( https://developer.android.com/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html#chooseDropTarget(android.support.v7.widget .RecyclerView.ViewHolder,%20java.util.List%3Candroid.support.v7.widget.RecyclerView.ViewHolder%3E,%20int,%20int) ) ドラッグ中の現在の指の座標であるかのように、しかしそれらはの座標です移動を適用した後のドラッグされたビューの左上端の座標。今、私は少しばかげていると感じています。ドキュメントをもっとよく読むべきでした:|curYItemTouchHelper.Callback.chooseDropTarget

左上の座標は必要ではなく、指の位置が必要だったので、私の解決策は、ソース ビューに接続されたタッチ リスナーを使用することでしtouchSrcX = MotionEvent.getX()touchSrcY = MotionEvent.getY()。次に、chooseDropTargetコールバックでターゲットを選択する前に点の移動を適用しました。つまり、次のようなものです。 curX += touchSrcX curY += touchSrcY

誰かがより詳細な説明やより良い説明を必要とする場合は、私に連絡してください。喜んでお手伝いします! :)

于 2016-10-20T06:33:53.700 に答える