RecyclerView 实现侧滑删除和拖动排序

xiaoxiao2021-02-28  138

在使用ListView的时候实现拖动排序,主要靠继承别人第三方的,在网上有很多例子,

这里不介绍,主要是介绍一下recycleview的拖动排序和滑动删除

一、主要知识点:

            1、 ItemTouchHelper.Callback的使用

             2、接口传值

ItemTouchHelper.Callback

      getMovementFlags:回调监听时先调用的,用来判断当前是什么动作,比如判断方向

      isLongPressDragEnabled  是否允许长按拖拽效果

      onMove   当移动的时候回调的方法 拖拽

     onSelectedChanged  当前选中的条目拖拽或滑动时执行

    clearView  当用户与itemview交互完且动画执行完,调用

    onSwiped 侧滑的时候回调

    onChildDraw  在RecyclerView调用onDraw方法的时候,调用此方法

二、流程

    1、创建adapter绑定在RecyclerView上

     2、给RecyclerView绑定ItemTouchHelper

           ItemTouchHelper   itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(myAdapter));            itemTouchHelper.attachToRecyclerView(recyclerView);

    3、在构造ItemTouchHelper对象时候,需要实现它的Callback,可以直接创建,也可以创建Class实现

    4、绑定startDrag方法

    5、然后再ItemTouchHelper.Callback完成相应的操作

三、以下是代码:

     创建一个这样的item代

 

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="wrap_content"     android:orientation="vertical">

    <RelativeLayout         android:layout_width="match_parent"         android:layout_height="80dp">

        <LinearLayout             android:layout_width="match_parent"             android:layout_height="match_parent"             android:orientation="horizontal">

            <ImageView                 android:id="@+id/item_test_imageview_icon"                 android:layout_width="wrap_content"                 android:layout_height="wrap_content"                 android:layout_margin="10dp"                 android:src="@mipmap/logo_1" />

            <LinearLayout                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:gravity="center_vertical"                 android:orientation="vertical">

                <TextView                     android:id="@+id/item_test_textView_name"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"                     android:text="我是测试"                     android:textColor="#000000"                     android:textSize="16sp" />

                <TextView                     android:id="@+id/item_test_textView_descirption"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"                     android:layout_marginTop="10dp"                     android:text="我是测试"                     android:textColor="#858585"                     android:textSize="14sp" />

            </LinearLayout>         </LinearLayout>

        <TextView

            android:layout_width="100dp"             android:layout_height="80dp"             android:layout_alignParentRight="true"             android:background="#f33213"             android:gravity="center"             android:text="删除"             android:textColor="#ffffff"             android:textSize="16sp"             android:visibility="gone" />     </RelativeLayout>

    <TextView         android:layout_width="match_parent"         android:layout_height="1px"         android:background="#585858" />

</LinearLayout>

  创建ItemTouchHelperCallback类   public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {     private ItemTouchMoveListener moveListener;

    public ItemTouchHelperCallback(ItemTouchMoveListener moveListener) {         this.moveListener = moveListener;     }

    //Callback 回调监听时先调用的,用来判断当前是什么动作,比如判断方向     @Override     public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {         //up down ,left,right

        //拖拽方向是那两个         int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;         //0不监听,侧滑方向         int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;

        int flags = makeMovementFlags(dragFlags, swipeFlags);         return flags;     }

    @Override     public boolean isLongPressDragEnabled() {         //是否允许长按拖拽效果         return super.isLongPressDragEnabled();     }

    //当移动的时候回调的方法 拖拽     @Override     public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {         if (viewHolder.getItemViewType() != target.getItemViewType()) {             return false;         }         //拖拽时,不断地调用adapter.notifyItemMoved(from,to)

        return moveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());     }

 

    @Override     public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {

        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {             viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(R.color.colorPrimary));

        }

        super.onSelectedChanged(viewHolder, actionState);     }

    @Override     public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {         //恢复         viewHolder.itemView.setBackgroundColor(Color.WHITE); //        viewHolder.itemView.setAlpha(1);//1~0 //        viewHolder.itemView.setScaleX(1); //        viewHolder.itemView.setScaleY(1);         super.clearView(recyclerView, viewHolder);     }

    //侧滑的时候回调     @Override     public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {         //侧滑监听,调用notifyItemRemoved(position)         moveListener.onItemRemove(viewHolder.getAdapterPosition());     }

    @Override     public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

        //dX水平方向移动的增量(负,左。正,右)0-view,getWidth         float alpha=1-Math.abs(dX)/viewHolder.itemView.getWidth();         if(actionState==ItemTouchHelper.ACTION_STATE_SWIPE){             //透明度变化

            viewHolder.itemView.setAlpha(alpha);//1~0             viewHolder.itemView.setScaleX(alpha);             viewHolder.itemView.setScaleY(alpha);         }

        if(alpha==0){             viewHolder.itemView.setAlpha(1);//1~0             viewHolder.itemView.setScaleX(1);             viewHolder.itemView.setScaleY(1);         }

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);     } }

 创建 adapter   

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements ItemTouchMoveListener {     private List<MessageEntity> list;     private StartDragInterface dragInterface;

    public MyAdapter(List<MessageEntity> list, StartDragInterface dragInterface) {         this.list = list;         this.dragInterface = dragInterface;     }

    @Override     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {         return new MyViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_test, parent, false));     }

    @Override     public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {         if (holder instanceof MyViewHolder) {

            ((MyViewHolder) holder).textView_name.setText(list.get(position).getName());             ((MyViewHolder) holder).text_description.setText(list.get(position).getDescription());             ((MyViewHolder) holder).imageView.setImageResource(list.get(position).getIcon());

            ((MyViewHolder) holder).imageView.setOnTouchListener(new View.OnTouchListener() {                 @Override                 public boolean onTouch(View v, MotionEvent event) {                     if (event.getAction() == MotionEvent.ACTION_DOWN) {                         //按下                         if (dragInterface != null) {                             dragInterface.onStartDrag(holder);                         }                     }                     return false;                 }             });         }     }

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

    @Override     public boolean onItemMove(int formPosition, int toPosition) {         Collections.swap(list, formPosition, toPosition);         notifyItemMoved(formPosition, toPosition);         return true;     }

    @Override     public boolean onItemRemove(int position) {         list.remove(position);         notifyItemRemoved(position);         return true;     }

    private class MyViewHolder extends RecyclerView.ViewHolder {

        public ImageView imageView;         public TextView textView_name, text_description;

        public MyViewHolder(View itemView) {             super(itemView);             imageView = (ImageView) itemView.findViewById(R.id.item_test_imageview_icon);             textView_name = (TextView) itemView.findViewById(R.id.item_test_textView_name);             text_description = (TextView) itemView.findViewById(R.id.item_test_textView_descirption);

        }     }

   

public interface ItemTouchMoveListener {     boolean onItemMove(int formPosition, int toPosition);

    boolean onItemRemove(int position); }

public interface StartDragInterface {         void onStartDrag(RecyclerView.ViewHolder viewHolder); }

 

public class MessageEntity {     private int icon;     private String name;     private String description;

    public MessageEntity(int icon, String name, String description) {         this.icon = icon;         this.name = name;         this.description = description;     }

    public int getIcon() {         return icon;     }

    public void setIcon(int icon) {         this.icon = icon;     }

    public String getName() {         return name;     }

    public void setName(String name) {         this.name = name;     }

    public String getDescription() {         return description;     }

    public void setDescription(String description) {         this.description = description;     } }

public class MainActivity extends AppCompatActivity implements StartDragInterface {     private RecyclerView recyclerView;     private MyAdapter myAdapter;     private List<MessageEntity> listData = new ArrayList<>();     private ItemTouchHelper itemTouchHelper;

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

        recyclerView = (RecyclerView) findViewById(R.id.activity_main_recyclerView);         initData();         myAdapter = new MyAdapter(listData,this);         recyclerView.setLayoutManager(new LinearLayoutManager(this));         recyclerView.setAdapter(myAdapter);         //条目触摸帮助类         itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(myAdapter));         itemTouchHelper.attachToRecyclerView(recyclerView);

//        itemTouchHelper.startDrag(); //        itemTouchHelper.startSwipe();     }

    @Override     public void onStartDrag(RecyclerView.ViewHolder viewHolder) {         itemTouchHelper.startDrag(viewHolder);     }

    private void initData() {         for (int i = 0; i < 20; i++) {             MessageEntity entity = new MessageEntity(R.mipmap.logo_1, "Test" + i, "我是描述我是描述" + i);             listData.add(entity);         }     }

 

代码在我的资源中可以免费下载

转载请注明原文地址: https://www.6miu.com/read-21456.html

最新回复(0)