1.二话不说,先来一个简单的RecyclerView
1.1MainActivity中onCreat()代码
rv_main = (RecyclerView) findViewById(R.id.rv_main);
rv_main.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
//rv_main.setLayoutManager(new GridLayoutManager(this,2));
adapter = new MyAdapter(list);
rv_main.setAdapter(adapter);
1.2MyAdapter类中的代码,四个回调方法
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem, parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText((String)(list.get(position)));
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
public TextView textView;
public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.tv);
}
}
以上是RecyclerView 的实现形式,下面写拖动和侧滑的实现。。。。。。。。。。。。。。。。。。
2.ItemTouchHelper类
2.1MainActivity中的代码 ,
MessageItemTouchCallback messageItemTouchCallback = new MessageItemTouchCallback(adapter);
//触摸帮助类
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(messageItemTouchCallback);
itemTouchHelper.attachToRecyclerView(rv_main);
2.2自定义ItemTouchHelper的Callback类: MessageItemTouchCallback
ItemTouchHelper需要传入callBack,我们新建类 MessageItemTouchCallback继承 ItemTouchHelper.Callback 并重写3个方法
- 方法一:getMovementFlags() 判断是否需要监听 侧滑和拖拽
- 方法二:onMove() 拖拽的回调方法
- 方法三:onSwiped() 滑动的回调方法
2.3 getMovementFlags方法中的代码。
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//判断是否需要监听动作:侧滑,拖拽
//允许上下拖拽
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//允许左右侧滑
int swipFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, swipFlags);
}
这样就可以拖拽和侧滑了,但是拖拽和侧滑后的刷新数据和适配器的操作需要在onMove()和onSwiped中实现
我们可以把adapter和list传进来,当然为了解耦,我选择了接口的方式。
3.新建接口类
public interface ItemTouchHelperAdapterCallback {
//从什么位置移到什么位置
boolean onItemMove(int fromPosition,int toPosition);
//侧滑的条目
void onItemSwiped(int position);
}
3.1让MyAdapter实现此接口,在接口方法中实现刷新适配器
//重写接口方法
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
//1.刷新数据 交换两个数据的条目
Collections.swap(list,fromPosition,toPosition);
//2.刷新适配器
// notifyDataSetChanged();这样全部刷新适配器,只能上下挪动一个位置
notifyItemMoved(fromPosition,toPosition);
return false;
}
@Override
public void onItemSwiped(int position) {
//1.刷新数据
list.remove(position);
//2.刷新适配器
notifyItemRemoved(position);
}
3.2并在MessageItemTouchCallback中传入自定义的接口,并调用接口方法实现刷新
private ItemTouchHelperAdapterCallback adapterCallback;
//不传适配器,而是传适配器的接口
public MessageItemTouchCallback(ItemTouchHelperAdapterCallback adapterCallback) {
this.adapterCallback = adapterCallback;
}
//............................................................
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//1.刷新数据
//2.刷新界面(adapter)
// adapter.notifyDatasetChanged();
adapterCallback.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//1.刷新数据
//2.刷新界面(adapter)
adapterCallback.onItemSwiped(viewHolder.getAdapterPosition());
}
这样就初步实现了RecyclerView的侧滑删除和长按拖动。