recyclerview 拖拽和滑动的简单实现
1、ItemTouchHelper.SimpleCallback
ItemTouchHelper.SimpleCallback 是 ItemTouchHelper的一个简单实现类 通过这个类 我们可以非常方面的实现拖拽和滑动。
比如:
ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(int dragDirs, int swipeDirs)
dragDirs支持四个值
ItemTouchHelper.UP | ItemTouchHelper.DOWN|ItemTouchHelper.lEFT| ItemTouchHelper.RIGHT
swipeDirs也是支持四个值
ItemTouchHelper.lEFT| ItemTouchHelper.RIGHT| ItemTouchHelper.START| ItemTouchHelper.END
例如:
ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP| ItemTouchHelper.RIGHT| ItemTouchHelper.LEFT, ItemTouchHelper.RIGHT|ItemTouchHelper.LEFT | ItemTouchHelper.START
|ItemTouchHelper.END) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {}
};
这里 我们需要实现 两个抽象方法 onMove 和 onSwiped
onMove方法里面写上两个对象的交换,然后调用adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
返回true
比如:
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Collections.swap(datas, viewHolder.getAdapterPosition(), target.getAdapterPosition());
adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
在onSwiped方法中从数据集里面删除滑动的对象 然后调用
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
例如:
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
datas.remove(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
最后通过ItemTouchHelper的attachToRecyclerView方法管理recyclerview
例如:
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView( mRecyclerView);
到此 一个简单的拖拽和滑动就实现了
当然 我们还是得实现一点小小的动画 比如在进行拖拽的时候,被拖拽的那个item应该背景颜色变得和其他item不一样并且这个item会进行缩放,那么我们就得重写onSelectedChanged方法
比如 :
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (viewHolder != null){
viewHolder.itemView.setScaleX(1.5F);
viewHolder.itemView.setScaleY(1.5F);
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
当拖拽完成后,将其变回原来的样子 重写clearView方法
比如
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
viewHolder.itemView.setScaleX(1F);
viewHolder.itemView.setScaleY(1F);
}
当我们在进行滑动删除的时候 我们希望在删除的时候 透明度能变高
那么我们得重写onChildDraw方法
比如
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE){
final float alpha = 1.0f - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
下面是这个demo的主要源码
package com.simple.sliderecyclerview;
import android.graphics.Canvas;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import java.util.ArrayList;
import java.util.Collections;
public class MainActivity extends AppCompatActivity{
private RecyclerView mRecyclerView;
private RecyclerView.LayoutManager mLayoutManager;
private ArrayList<String> datas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initdata();
final MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(datas);
mRecyclerView = (RecyclerView) findViewById(R.id.recylerview);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setAdapter(adapter);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP
| ItemTouchHelper.RIGHT| ItemTouchHelper.LEFT, ItemTouchHelper.RIGHT| ItemTouchHelper.LEFT | ItemTouchHelper.START
|ItemTouchHelper.END) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Collections.swap(datas, viewHolder.getAdapterPosition(), target.getAdapterPosition());
adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
datas.remove(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (viewHolder != null){
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
viewHolder.itemView.setScaleX(1.5F);
viewHolder.itemView.setScaleY(1.5F);
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
viewHolder.itemView.setScaleX(1F);
viewHolder.itemView.setScaleY(1F);
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE){
final float alpha = 1.0f - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
};
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView( mRecyclerView);
}
public void initdata(){
for (int i = 0 ; i < 21; i++){
datas.add("Text " + i);
}
}
}
至于其他的功能就靠大家自己发掘了。或者大家可以不用ItemTouchHelper.SimpleCallback,直接写一个ItemTouchHelper.CallBack的子类 ,去实现其中的方法,具体的就不介绍了,可以去参考大神写的https://github.com/iPaulPro/Android-ItemTouchHelper-Demo