Recyclerview進階——元素拖拽及側滑刪除

之前一直覺得列表的拖拽換位和側滑刪除是很難實現的,不過之後參考了下幾篇博客後發,發現還是很簡單的,因爲suppor早就封裝好了,最主要的是繼承ItemTouchHelper.Callback,並對其方法

效果圖如下:

步驟如下:

1、新建類並繼承ItemTouchHelper.Callback,在其對應方法設置相應操作包括,不同佈局的拖拽和側滑刪除,選擇效果

2、Adapter中實現自定義的監聽回調,對位置交換和刪除動作做對應的數據操作和界面的刷新

3、主代碼中 新建ItemTouchHelper 並關聯RecyclerView即可

代碼如下:

1、新建類並繼承ItemTouchHelper.Callback,在其對應方法設置相應操作

public interface ItemTouchHelperAdapter {
    //數據交換
    void onItemMove(int fromPosition,int toPosition);
    //數據刪除
    void onSwiped(int position);
}
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

    private ItemTouchHelperAdapter mAdapter;
    private boolean dragEnabled;        //能否拖拽
    private boolean swipeEnabled;       //能否側滑


    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter, boolean dragEnabled, boolean swipeEnabled) {
        mAdapter = adapter;
        this.dragEnabled = dragEnabled;
        this.swipeEnabled = swipeEnabled;
    }

    //同來設置 拖拽移動,或移動刪除
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {// GridLayoutManager
            // flag如果值是0,相當於這個功能被關閉
            int dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            int swipeFlag = 0;
            // create make
            return makeMovementFlags(dragFlag, swipeFlag);
        } else if (layoutManager instanceof LinearLayoutManager) {// linearLayoutManager
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
            int orientation = linearLayoutManager.getOrientation();

            int dragFlag = 0;
            int swipeFlag = 0;

            // 爲了方便理解,相當於分爲橫着的ListView和豎着的ListView
            if (orientation == LinearLayoutManager.HORIZONTAL) {// 如果是橫向的佈局
                swipeFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                dragFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            } else if (orientation == LinearLayoutManager.VERTICAL) {// 如果是豎向的佈局,相當於ListView
                dragFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                swipeFlag = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            }
            return makeMovementFlags(dragFlag, swipeFlag);
        }
        return 0;
    }

    //是否能拖動
    @Override
    public boolean isLongPressDragEnabled() {
        return dragEnabled;
    }

    //是否能側滑
    @Override
    public boolean isItemViewSwipeEnabled() {
        return swipeEnabled;
    }

    //拖動
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        Log.e(TAG, "onMove");
//        if (viewHolder.getAdapterPosition() == 0) {
            //第一個無法拖拽
//            return false;
//        }
        mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    //左右滑動
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mAdapter.onSwiped(viewHolder.getAdapterPosition());
        Log.e(TAG, "onSwiped");
    }

    //選中項操作
    @Override
    public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) {
        super.onSelectedChanged(viewHolder, actionState);
        Log.e(TAG, "onSelectedChanged");

        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
            if (viewHolder != null)
                viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
        }
    }

    //釋放選中項操作
    @Override
    public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        super.clearView(recyclerView, viewHolder);
        Log.e(TAG, "clearView");
        viewHolder.itemView.setBackgroundColor(0);
    }
}

2、Adapter中實現自定義的監聽回調

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Holder> implements ItemTouchHelperAdapter {

    private Context mContext;
    private List<String> mList;

    public MyAdapter(Context context, List<String> list) {
        mContext = context;
        mList = list;
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new Holder(LayoutInflater.from(mContext).inflate(R.layout.item_test, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(@NonNull final Holder holder, final int i) {
        holder.tvF.setText(mList.get(i));
        holder.tvS.setText(mList.get(i));
        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //移除數據
                mList.remove(i);
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        //交換位置
        Collections.swap(mList, fromPosition, toPosition);
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public void onSwiped(int position) {
        //移除數據
        mList.remove(position);
        notifyItemRemoved(position);
    }

    static class Holder extends RecyclerView.ViewHolder {
        private TextView tvF;
        private TextView tvS;
        private ImageView delete;

        public Holder(@NonNull View itemView) {
            super(itemView);
            tvF = itemView.findViewById(R.id.tv_first);
            tvS = itemView.findViewById(R.id.tv_second);
            delete = itemView.findViewById(R.id.delete);
        }
    }
}

3、主代碼中 新建ItemTouchHelper 並關聯RecyclerView

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "recyclerviewmove";
    private Button btnChange;
    private RecyclerView mRecyclerView;
    private MyAdapter mMyAdapter;

    private List<String> mList = new ArrayList<>();
    private boolean bGrid;      //佈局標識


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (int i = 0; i < 9; i++) {
            mList.add(i + "" + i + "" + i);
        }
        mRecyclerView = findViewById(R.id.recycler_view);
        btnChange = findViewById(R.id.btn_change);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mMyAdapter = new MyAdapter(this, mList);
        mRecyclerView.setAdapter(mMyAdapter);
        //關聯ItemTouchHelper和RecyclerView
        ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(mMyAdapter,true,true);
        ItemTouchHelper touchHelper = new ItemTouchHelper(callback);
        touchHelper.attachToRecyclerView(mRecyclerView);

        btnChange.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (bGrid) {
                    mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
                } else {
                    mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 4));
                }
                bGrid = !bGrid;
            }
        });
    }
}

參考:https://blog.csdn.net/a553181867/article/details/54799391

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章