1. ホーム
  2. android

[解決済み] ItemTouchHelper.SimpleCallbackを使用してRecyclerViewの位置のスワイプを無効化する。

2022-10-10 17:27:33

質問

私は recyclerview 22.2.0 を使用しており、ヘルパー クラス ItemTouchHelper.SimpleCallback を使って スワイプして離す を有効にしています。しかし、私はその上にヘッダーのタイプを持っているので、私はアダプタの最初の位置のためのスワイプ動作を無効にする必要があります。というように RecyclerView.Adapter には isEnabled() メソッドを通してビューのインタラクションを無効化しようとしました。 isEnabled() isFocusable() をViewHolderの作成自体に組み込んでみましたが、うまくいきませんでした。スワイプの閾値を一杯に調整しようと、例えば 0f オット 1f SimpleCallbackのメソッドで getSwipeThreshold() と入力しても、成功しません。

私のコードのいくつかの断片は、あなたが私を助けるのを助けるために。

私のアクティビティです。

@Override
protected void onCreate(Bundle bundle) {
    //... initialization
    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                          RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
            if (viewHolder instanceof CartAdapter.MyViewHolder) return 1f;
            return super.getSwipeThreshold(viewHolder);
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {

        }
    };

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView);
}

そして、共通のアダプタに ビュータイプがあります。その中で ビューホルダー で、スワイプを無効化したい場合は、そうしました。

public static class MyViewHolder extends RecyclerView.ViewHolder {
    public ViewGroup mContainer;

    public MyViewHolder(View v) {
        super(v);
        v.setFocusable(false);
        v.setEnabled(false);
        mContainer = (ViewGroup) v.findViewById(R.id.container);      
    }
}

どのように解決するのですか?

少し遊んだ後、私はそれを管理する SimpleCallback というメソッドを持っています。 getSwipeDirs() . に対して特定のViewHolderを持っているので スワイプできない の位置のために、私は インスタンスオブ を使ってスワイプを回避することができます。そうでない場合は、AdapterのViewHolderの位置を利用してこの制御を行うことができます。

Java

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder instanceof CartAdapter.MyViewHolder) return 0;
    return super.getSwipeDirs(recyclerView, viewHolder);
}

コトリン

override fun getSwipeDirs (recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
    if (viewHolder is CartAdapter.MyViewHolder) return 0
    return super.getSwipeDirs(recyclerView, viewHolder)
}