在使用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); } }
创建 adapterpublic 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); } }
代码在我的资源中可以免费下载