您的位置:首页 > 其它

material design(三)recycleview的ItemTouchHelper

2017-04-10 10:57 225 查看

前言:

上一篇文章,material design(二)RecycleView的使用详解,简单介绍了recycleview的使用,并且实现了item的点击和长按事件效果。Android提供了一个ItemTouchHelper类,顾名思义,这完全就是为了服务item的类。下面我们来通过这个类来实现item的滑动删除和拖拽实现位置交换的效果。

使用:

1 继承ItemTouchHelper.Callback

public class RecycleItemTouchHelper extends ItemTouchHelper.Callback {

private ListViewAdapter mAdapter;

public RecycleItemTouchHelper(ListViewAdapter madapter) {

this.mAdapter=madapter;
}

/**
* 设置滑动类型标记
* @param recyclerView
* @param viewHolder
* @return 返回一个整数类型的标识,用于判断Item那种移动行为是允许的
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
/**
* START  右向左
* END  左向右
* LEFT  向左
* RIGHT 向右
* UP  向上
* 如果某个值传0,表示不触发该操作,次数设置支持上下拖拽,支持向右滑动
*/

return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.END|ItemTouchHelper.START);
}

/**
* 拖拽切换item的回调
* @param recyclerView
* @param viewHolder
* @param target
* @return true切换了拖拽  false 没有切换
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
return true;
}

/**
* 滑动的回调
* @param viewHolder
* @param direction
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}

/**
* 是否支持长按拖拽
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
}

/**
* item是否支持滑动
* @return
*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}

/**
* 恢复到原状态,没有消失
* @param recyclerView
* @param viewHolder
*/
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
Log.i("sssssssss1","11111");
}

/**
*
* @param viewHolder
* @param actionState 0正在侧滑 1释放
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
Log.i("sssssssss2","22222"+actionState);
if (actionState!= ItemTouchHelper.ACTION_STATE_IDLE){
viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
}
}

/**
* item滑动
* @param c
* @param recyclerView
* @param viewHolder
* @param dX
* @param dY
* @param actionState
* @param isCurrentlyActive
*/
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
Log.i("sssssssss3","3333"+isCurrentlyActive);
}

/**
* 滑动停止
* @param c
* @param recyclerView
* @param viewHolder
* @param dX
* @param dY
* @param actionState
* @param isCurrentlyActive
*/
@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
Log.i("sssssssss4","4444"+dY);
}
}
代码还是比较简单的,首先传一个adapter进来,主要是为了回调事件。
getMovementFlags  滑动类型标记

onMove 拖拽交换事件

onSwiped 滑动删除事件

其他事件也都有注释,可以看看自己点击看看log日志。

***2***  adapter
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> implements ItemTouchHelperAdapter {

private Context mContext;
private List<ListBean> mData=new ArrayList<>();
private LayoutInflater inflater;

public List<ListBean> getData() {
return mData;
}

public void setData(List<ListBean> data) {
mData = data;
notifyDataSetChanged();
}

public void addData(List<ListBean> data){
mData.addAll(data);
notifyDataSetChanged();
}

/**
* 复用item布局
* @param parent Recycleview
* @param viewType type类型
* @return 内部类viewhodler对象
*/

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(mContext==null){
mContext=parent.getContext();
inflater=LayoutInflater.from(mContext);
}
View view= inflater.inflate(R.layout.listview_item,parent,false);
Log.i("sssss1",parent.toString()+"    "+viewType);
return new ListViewAdapter.ViewHolder(view);
}

/**
*
* @param holder onCreateViewHolder返回的holder
* @param position 位置
*/
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
Log.i("sssss2",holder.toString()+"    "+position);
ListBean bean=mData.get(position);
holder.mTextView.setText(bean.getName());
//        holder.mTextView.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                addData(position);
//            }
//        });
//        holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
//            @Override
//            public boolean onLongClick(View v) {
//                removeData(position);
//                return false;
//            }
//        });

}

@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}

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

@Override
public void onItemMove(int fromPosition, int toPosition) {
Collections.swap(mData, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
}

@Override
public void onItemDismiss(int position) {
mData.remove(position);
notifyItemRemoved(position);
}

/**
* ViewHolder的内部类,View为item的布局,其他小的控件
* 可以findviewbyid获得,这个view就是textview
*/
static class ViewHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public ViewHolder(View itemView) {
super(itemView);
mTextView= (TextView) itemView.findViewById(R.id.tv_item);
}
}
public void addData(int position) {
mData.add(position, new ListBean("Insert One"));
notifyItemInserted(position);
}

public void removeData(int position) {
mData.remove(position);
notifyItemRemoved(position);
}
}


主要是事件的监听,同时要主要数据更新通知调用的方法,这样才有动画。

3 监听接口 ItemTouchHelperAdapter

public interface ItemTouchHelperAdapter {

//交换
void onItemMove(int fromPosition, int toPosition);

//滑动删除
void onItemDismiss(int position);

}


4 activity

//-------------item---------------------------
ItemTouchHelper.Callback helper=new RecycleItemTouchHelper(mListViewAdapter);
ItemTouchHelper touchHelper=new ItemTouchHelper(helper);
touchHelper.attachToRecyclerView(mRecyclerView);


设置callback到recycleview中,这样就能实现item的数据交换和滑动删除了,是不是很简单。欢迎留言交流。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  recyclevie