最終更新日:190209原本2018-11-27 


android 移動 listview - ItemTouchHelper.SimpleCallbackを使用してRecyclerViewの位置をスワイプしない




3 Answers

誰かがItemTouchHelper.Callbackを使用している場合。 その後、 getMovementFlags(..)関数で関連するフラグをすべて削除できます。

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
    return makeMovementFlags(dragFlags, swipeFlags);
}

dragFlagsswipeFlagsの代わりに0を渡して、対応する機能を無効にすることができます。

ItemTouchHelper.STARTは、左から右のロケール(LTRアプリケーションサポート)の場合は左から右にスワイプすることを意味しますが、右から左ロケール(RTLアプリケーションのサポート)の場合は逆です。 ItemTouchHelper.ENDは、 STARTの反対方向にスワイプすることを意味します。

要件に応じてフラグを削除することができます。

スライド 削除 並び替え

私はrecyclerview 22.2.0とヘルパークラスItemTouchHelper.SimpleCallbackを使用して、 スワイプからディスマイスへのオプションを自分のリストに有効にしています。 しかし、私はそれにヘッダのタイプを持っているので、私はアダプタの最初の位置のスワイプの動作を無効にする必要があります。 RecyclerView.AdapterにisEnabled()メソッドがないため、ViewHolderの作成自体でisEnabled()メソッドとisFocusable()メソッドを通してビューの対話を無効にしようとしましたが、成功しませんでした。 私は、スワイプのスレッショルドを、SimpleCallbackのメソッドgetSwipeThreshold()0f ot 1fのように完全な値に調整しようとしましたが、成功もありませんでした。

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

私の活動:

@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);
}

私は2つのビュータイプの共通のアダプターを持っています。 スワイプを無効にしたいViewHolderでは、私はこうしました:

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);      
    }
}



これについてはいくつかの方法がありますが、ViewHolderは1つだけですが、複数のレイアウトがある場合は、このアプローチをとることができます。

getItemViewTypeをオーバーライドし、オブジェクト内のデータの位置またはタイプに基づいてビューの型を決定するロジックを与えます(私のオブジェクトにはgetType関数があります)

@Override
public int getItemViewType(int position) {
    return data.get(position).getType;
}

ViewTypeに基づいてonCreateViewの適切なレイアウトを返します(ViewHolderクラスにビュータイプを渡すようにしてください)。

@Override
public AppListItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    mContext = parent.getContext();

    if (viewType == 0){
        return new AppListItemHolder(LayoutInflater.from(mContext).inflate(R.layout.layout, parent, false), viewType);
    else
        return new AppListItemHolder(LayoutInflater.from(mContext).inflate(R.layout.header, parent, false), viewType);
    }
}

ビューのタイプに基づいて異なるレイアウトのコンテンツビューを取得するpublic static class AppListItemHolder extends RecyclerView.ViewHolder {

    public AppListItemHolder (View v, int viewType) {
        super(v);

        if (viewType == 0)
            ... get your views contents
        else
            ... get other views contents
        }
    }
}

そしてあなたのItemTouchHelperでは、ViewTypeに基づいてアクションを変更します。 私にとってこれはRecyclerViewセクションヘッダーのスワイプを無効にする

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder.getItemViewType() == 1) return 0;
        return super.getSwipeDirs(recyclerView, viewHolder);
    }
}



最初にrecyclerViewでonCreateViewHolderメソッドで、以下のコードのようにviewHolderタイプごとにタグを設定します。

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    if(ITEM_TYPE_NORMAL == viewType) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.deposite_card_view, viewGroup, false);
        ItemViewHolder holder = new ItemViewHolder(context, v);
        holder.itemView.setTag("normal");
        return holder;
    } else {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_header, viewGroup, false);
        HeaderViewHolder holder = new HeaderViewHolder(context, v);
        holder.itemView.setTag("header");
        return holder;
    }
} 

ItemTouchHelper.Callback実装では、次のようにgetMovementFlagsメソッドを更新します。

public class SwipeController extends ItemTouchHelper.Callback {

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if("normal".equalsIgnoreCase((String) viewHolder.itemView.getTag())) {
        return makeMovementFlags(0, LEFT | RIGHT);
    } else {
        return 0;
    }
}

recyclerViewへの最後の添付で:

final SwipeController swipeController = new SwipeController();

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(swipeController);
    itemTouchHelper.attachToRecyclerView(recyclerView);