mainActivirt.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/rl_data" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
itme_home.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_margin="5dp"
android:background="@drawable/item_bg"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/id_num"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="1" />
</FrameLayout>
item_bg.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" android:drawable="@color/colorPrimaryDark"></item> <item android:drawable="@color/colorAccent"></item> </selector>
itme_layout.xml
<?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="horizontal"> <ImageView android:id="@+id/iv_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <TextView android:layout_gravity="center" android:paddingLeft="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tv_data"/> </LinearLayout>
ItemTouchMoveListener
public interface ItemTouchMoveListener { /** * 当拖拽的时候回调 * 可以在此方法实现拖拽条目,并实现刷新效果 * @param fromPosition 从什么位置拖拽 * @param toPosition 到什么位置 * @return 是否执行 */ boolean onItemMove(int fromPosition, int toPosition); /** * 当条目被移除的回调 * @param position * @return */ boolean onItemRemove( int position); }
MyItemTouchHelperCallBack
public class MyItemTouchHelperCallBack extends ItemTouchHelper.Callback { private ItemTouchMoveListener mItemTouchMoveListener; public MyItemTouchHelperCallBack(ItemTouchMoveListener itemTouchMoveListener) { mItemTouchMoveListener = itemTouchMoveListener; } //callback回调监听先调用的,用来判断是什么动作,比如判断方向(意思就是我要监听那个方向的拖到) @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //方向Up,down.left,right //ItemTouchHelper.UP,ItemTouchHelper.DOWN,ItemTouchHelper.LEFT,ItemTouchHelper.RIGHT int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//添加上下滑动 //int swipeFlags = 0; int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//添加左右滑动 int flags = makeMovementFlags(dragFlags, swipeFlags); return flags; } //当移动的时候回调的方法 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { if (viewHolder.getItemViewType() != target.getItemViewType()) {//条目布局不同,就不交换位置 return false; } //adapter.notifyItemMoved(fromPosition,toPosition);改变拖拽item位置 mItemTouchMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return false; } //侧滑 @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //监听侧滑1:删除数据;2:adapter.notifyItemRemove(position) mItemTouchMoveListener.onItemRemove(viewHolder.getAdapterPosition()); } //item改变状态 @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); super.clearView(recyclerView, viewHolder); } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { //dx,侧滑改变特效 if (actionState==ItemTouchHelper.ACTION_STATE_SWIPE){ //设置透明度1-0 float result = Math.abs(dX) / viewHolder.itemView.getWidth(); viewHolder.itemView.setAlpha(result); //旋转 viewHolder.itemView.setScaleX(result); viewHolder.itemView.setScaleY(result); } super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } @Override public boolean isLongPressDragEnabled() { //是否允许长按拖拽 return true; } }
MyRecyclerViewAdapter
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> implements ItemTouchMoveListener{ private Context mContext; private List<String> number; private OnStartDragListener mListener; public MyRecyclerViewAdapter(Context context, List<String> number, OnStartDragListener listener) { mContext = context; this.number = number; this.mListener = listener; } //在adapter里面加ItemTouchMoveListener和在MainActivity加有什么区别? @Override public boolean onItemMove(int fromPosition, int toPosition) { //1:数据交换; 2:刷新 Collections.swap(number,fromPosition,toPosition); notifyItemMoved(fromPosition,toPosition); return false; } @Override public boolean onItemRemove(int position) { //1:删除数据; 2:刷新 number.remove(position); notifyItemRemoved(position); return false; } class MyViewHolder extends RecyclerView.ViewHolder { private TextView tv_data; private ImageView iv_data; public MyViewHolder(View itemView) { super(itemView); tv_data = itemView.findViewById(R.id.tv_data); iv_data = itemView.findViewById(R.id.iv_data); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false); MyViewHolder myViewHolder = new MyViewHolder(inflate); return myViewHolder; } @Override public void onBindViewHolder(final MyViewHolder holder, int position) { holder.tv_data.setText(number.get(position)); holder.iv_data.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { //传递触摸情况给谁,进行按下图片拖拽 mListener.onStartDrag(holder); } return false; } }); } @Override public int getItemCount() { return number.size(); } }
OnStartDragListener
public interface OnStartDragListener { /** * 该接口用于需要主动回调拖拽效果的 * @param viewHolder */ void onStartDrag(RecyclerView.ViewHolder viewHolder); }
MainActivity
public class MainActivity extends AppCompatActivity implements OnStartDragListener /*,ItemTouchMoveListener*/ { private RecyclerView rl_data; private List<String> number; MyRecyclerViewAdapter adapter; ItemTouchHelper itemTouchHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rl_data = findViewById(R.id.rl_data); rl_data.setLayoutManager(new LinearLayoutManager(this)); number = new ArrayList<>(); for (int i = 0; i < 20; i++) { number.add("序列号" + i); } adapter = new MyRecyclerViewAdapter(this, number,this); rl_data.setAdapter(adapter); MyItemTouchHelperCallBack callback = new MyItemTouchHelperCallBack(adapter); itemTouchHelper = new ItemTouchHelper(callback); itemTouchHelper.attachToRecyclerView(rl_data); //itemTouchHelper.startDrag(viewholder);用接口回调OnStartDragListener() //itemTouchHelper.startSwipe(viewholder); } @Override public void onStartDrag(RecyclerView.ViewHolder viewHolder) { itemTouchHelper.startDrag(viewHolder); } /* @Override public boolean onItemMove(int fromPosition, int toPosition) { //1:数据交换; 2:刷新 Collections.swap(number,fromPosition,toPosition); adapter.notifyItemMoved(fromPosition,toPosition); return false; } @Override public boolean onItemRemove(int position) { //1:删除数据; 2:刷新 number.remove(position); adapter.notifyItemRemoved(position); return false; }*/ }