RecyclerView与ItemTouchHelper实现拖拽和侧滑(移动)删除

在这里插入图片描述
某天学习RecyclerView正好看到这样一个效果,感觉这个小功能实现应该不难而且也能巩固知识。

在开发过程中RecylerView常被用来代替ListView和GirdView实现更强大的功能,这里不花太多篇幅解释RecylerView。

1.布局文件
本实例布局比较简单,只使用到了两个TextView和RecylerView,XML文件如下:

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recy_vertical"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:scrollbars="vertical"/>

<View
    android:layout_width="match_parent"
    android:layout_height="50dp" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="horizontal swipe"
    android:textSize="20sp"/>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recy_horizontal"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

2.创建接口

public interface IOperationData {
    //交换数据
    void onItemMove (int fromPosition, int toPosition);
    //删除数据
    void onItemDissmiss(int position);
}

3.创建VerticalRecylerAdapter并实现接口

public class VerticalRecylerAdapter extends RecyclerView.Adapter implements  IOperationData {
    private Context mContext;
    private List<CountryBean> mList;
    private String[] mData;
    private RecylerHolder RecylerHolder;

    public VerticalRecylerAdapter(Context context, List<CountryBean> mList){
        this.mContext = context;
        this.mList = mList;
        mData = context.getResources().getStringArray(R.array.countries);
    }

    @NonNull

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //加载布局,创建ViewHolder
        View view = LayoutInflater.from(mContext).inflate(R.layout.vertical_list_item,parent,false);
        RecylerHolder = new VerticalRecylerAdapter.RecylerHolder(view);
        return RecylerHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        //填充控件数据
        RecylerHolder.textView.setText(mData[position]);
    }

    @Override
    public int getItemCount() {
        //返回List长度
        return mList != null ? mList.size() : 0;
    }

    //实现接口
    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        Collections.swap(mList,fromPosition,toPosition);
        notifyItemMoved(fromPosition,toPosition);
    }

    @Override
    public void onItemDissmiss(int position) {
        mList.remove(position);
        notifyItemRemoved(position);
    }

    //内部类,绑定控件
    class RecylerHolder extends RecyclerView.ViewHolder{
        private TextView textView;

         public RecylerHolder(@NonNull View itemView) {
             super(itemView);
             textView = (TextView)itemView.findViewById(R.id.item);
         }
     }
 }

4.创建TouchHelperCallback并继承ItemTouchHelper.Callback

public class HorizontalTouchHelperCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback{
        private HorizontalRecylerAdapter mRecylerAdapter;
        public HorizontalTouchHelperCallback(HorizontalRecylerAdapter recylerAdapter){
            this.mRecylerAdapter = recylerAdapter;
        }

        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            int dragFlags = ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//定义拖拽方向
            int swipeFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;//定义滑动方向
            return makeMovementFlags(dragFlags,swipeFlags);
        }

        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            mRecylerAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
            return true;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            mRecylerAdapter.onItemDissmiss(viewHolder.getAdapterPosition());
        }

        @Override
        public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE){
                final float alpha = 1 - Math.abs(dX) / (float)viewHolder.itemView.getHeight();
                viewHolder.itemView.setAlpha(alpha);
            }
        }
    }

5.MainActivity

 private void initData() {
        recyVertical = (RecyclerView)findViewById(R.id.recy_vertical);
        recyHorizontal = (RecyclerView)findViewById(R.id.recy_horizontal);
        mData = getResources().getStringArray(R.array.countries);

        for (int i = 0;i<mData.length; i++){
            CountryBean countryBean = new CountryBean();
            countryBean.setCountry(mData[i]);
            mCountryList.add(countryBean);
        }
        //实例化RecylerAdapter
        VerticalRecylerAdapter verticalApater = new VerticalRecylerAdapter(this,mCountryList);
        //设置布局管理器
        LinearLayoutManager verticalManager = new LinearLayoutManager(this);
        recyVertical.setLayoutManager(verticalManager);
        recyVertical.setAdapter(verticalApater);
        //实例化Callback
        TouchHelperCallback verticalCallback = new TouchHelperCallback(verticalApater);
        ItemTouchHelper verticalTouchHelper = new ItemTouchHelper(verticalCallback);
        verticalTouchHelper.attachToRecyclerView(recyVertical);
 }

到此,上下滑动拖拽、侧滑删除的效果就已经实现了,如果想做一个水平滑动拖拽、上下移动删除的效果,只需要按照相同原理在方法中设置LinearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);可实现水平滑动,
在getMovementFlags定义拖拽和滑动方向即可实现

参考文档
RecyclerView高级进阶总结:ItemTouchHelper实现拖拽和侧滑删除

发布了4 篇原创文章 · 获赞 0 · 访问量 34

猜你喜欢

转载自blog.csdn.net/er_fa/article/details/104679216