RecyclerView系列之三:使用ItemTouchHelper实现RecyclerView的条目交互特效
来源:互联网 发布:数据安全管理方案 编辑:程序博客网 时间:2024/04/29 18:28
- 文章目录
- 效果图
- ItemTouchHelper类解析和主要调用方法介绍
- 代码实现
- ItemTouchHelper类介绍:该类主要用于支持RecyclerView添加侧滑和拖拽特效的辅助类,虽然是辅助类,但该类本身却是不工作的,只作为中间类,联系RecyclerView和ItemTouchHelper.Callback这两个真正工作的类.
- 问题一:ItemTouchHelp怎么与RecyclerView怎么联系?->itemTouchHelper.attachToRecyclerView(recyclerView)在该方法中实现
//看人家的代码写的多风骚
public void attachToRecyclerView(@Nullable RecyclerView recyclerView) {
if (mRecyclerView == recyclerView) {
return; // nothing to do
}
if (mRecyclerView != null) {
destroyCallbacks();
}
mRecyclerView = recyclerView;
if (mRecyclerView != null) {
final Resources resources = recyclerView.getResources();
mSwipeEscapeVelocity = resources
.getDimension(R.dimen.item_touch_helper_swipe_escape_velocity);
mMaxSwipeVelocity = resources
.getDimension(R.dimen.item_touch_helper_swipe_escape_max_velocity);
setupCallbacks();
}
}
- 问题二:真正工作的Callback类怎么起作用?->在ItemTouchHelper构造函数中传入.
public class ItemTouchHelper extends RecyclerView.ItemDecoration
implements RecyclerView.OnChildAttachStateChangeListener {
//构造函数
public ItemTouchHelper(Callback callback) {
mCallback = callback;
}
- }
- 问题三:实现自己的CallBack并与RecyclerView联系起来->因为我们的拖拽和侧滑的动作都是在RecyclerView的适配器中进行,所有我们需要将自己实现的CallBack类和RecyclerView的Adapter通过接口关联起来
- 触摸接口主要定义两个方法:分别是长安拖拽和左右侧滑
public interface ItemTouchListener {
/**
* 左右滑动时,adapter回调该方法去删除该位置的item
* @param position
*/
boolean onItemRemove(int position);
/**
* 上下拖拽时回调方法,adpater将两个位置的item调换位置
* @param desPos
* @param targetPos
*/
boolean onItemMoved(int desPos,int targetPos);
}
- 让Adapter适配器实现触摸接口,而接口回调在CallBack实现类中处理
public class InteractiveAdapter extends RecyclerView.Adapter<InteractiveAdapter.InteractiveViewHolder> implements ItemTouchListener {
private final ItemDragListener mDragListener;
private final Context mContext;
private List<String> mData;
public InteractiveAdapter(Context context, ItemDragListener listener) {
this.mContext = context;
this.mDragListener = listener;
mData = new ArrayList<>();
}
public void setData(List<String> datas) {
this.mData = datas;
}
private List<String> getRealDatas() {
return mData;
}
@Override
public InteractiveViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View itemView = inflater.inflate(R.layout.item_interactive, parent, false);
return new InteractiveViewHolder(itemView);
}
@Override
public void onBindViewHolder(final InteractiveViewHolder holder, int position) {
String data = mData.get(position);
holder.name.setText(data);
holder.logo.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mDragListener != null) {
mDragListener.onItemDrag(holder);
}
}
return false;
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
public class InteractiveViewHolder extends RecyclerView.ViewHolder {
private final ImageView logo;
private final TextView name;
public InteractiveViewHolder(View itemView) {
super(itemView);
logo = (ImageView) itemView.findViewById(R.id.iv_logo);
name = (TextView) itemView.findViewById(R.id.tv_name);
}
}
@Override
public boolean onItemRemove(int position) {
getRealDatas().remove(position);
notifyItemRemoved(position);
return true;
}
@Override
public boolean onItemMoved(int desPos, int targetPos) {
Collections.swap(getRealDatas(), desPos, targetPos);
notifyItemMoved(desPos, targetPos);
return true;
}
}
- 实现自己的CallBack类,并进行方法解析
public class MyItemTouchHelpCallback extends ItemTouchHelper.Callback {
private final java.lang.String TAG = this.getClass().getSimpleName();
private final ItemTouchListener mItemTouchListener;
public MyItemTouchHelpCallback(ItemTouchListener listener) {
this.mItemTouchListener = listener;
}
/**
* 该方法主要用于设置事件的方向:上下拖拽和左右滑动
*
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
Logger.d(TAG, "getMovementFlags");
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;//拖拽方向:上下
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;//滑动方向:左右
return makeMovementFlags(dragFlags, swipeFlags);
}
/**
* 是否支持item左右滑动功能
*
* @return
*/
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
/**
* 是否支持item长按拖拽功能
*
* @return
*/
@Override
public boolean isLongPressDragEnabled() {
return true;
}
/**
* item拖拽回调的方法
*
* @param recyclerView
* @param viewHolder
* @param target
* @return
*/
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Logger.d(TAG, "onMove");
return mItemTouchListener.onItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
}
/**
* recyclerview滑动时,会调用该方法-》设置接口,让接口的实现类去真是处理
*
* @param viewHolder
* @param direction 滑动方向,可以判断是向左滑动还是向右
*/
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
Logger.d(TAG, "onSwiped");
mItemTouchListener.onItemRemove(viewHolder.getAdapterPosition());
}
/**
* item左右滑动时,改变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) {
Logger.d("dx:" + dX + " -dy:" + dY);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
float scale = 1 - (Math.abs(dX) / viewHolder.itemView.getWidth());// 1-0
viewHolder.itemView.setScaleX(scale);
viewHolder.itemView.setScaleY(scale);
viewHolder.itemView.setAlpha(scale);
}
- super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
- }
/**
* 当item拖拽或滑动时调用
*
* @param viewHolder
* @param actionState
*/
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
Logger.d("actionState:" + actionState);
//当item拽或滑动时改变item的背景-->放开时,item背景恢复
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
viewHolder.itemView.setBackgroundColor(Color.GRAY);
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
viewHolder.itemView.setBackgroundColor(Color.WHITE);
//处理item布局复用问题
viewHolder.itemView.setScaleX(1.0f);
viewHolder.itemView.setScaleY(1.0f);
viewHolder.itemView.setAlpha(1.0f);
super.clearView(recyclerView, viewHolder);
}
}
- ItemTouchHelper.Callback方法解析:
- getMovementFlags():获取条目的运动方向标示->在该方法中通过位运算与和makeMovementFlags方法获取,并返回.
- isItemViewSwipeEnabled():是否允许条目左右滑动->放回true表示允许
- ieLongPressDragEnable():是否运行长按拖拽功能->返回true
- onMove():条目拖拽时调用
- onSwiped():条目滑动时调用->接口回调
- onChildDraw():当条目左右滑动时,可以通过该方法为条目设置样式进行重新绘制
- onSelectedChanged():条目选中时调用
- clearView():条目滑动完或者拖拽完会调用的方法->可在该方法中进行样式的处理->界面重新绘制
- itemTouchHelper类实现拖拽效果:通过调用方法ItemTouchHelper.startDrag(ViewHolder )->也是通过接口和RecyclerView的适配器关联起来
- Activiey的代码
public class InteractiveRecyclerView extends BaseActivity implements ItemDragListener {
@Bind(R.id.rv_recycleView)
RecyclerView mRecyclerView;
private InteractiveAdapter adapter;
private ItemTouchHelper touchHelper;
private List<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_interactive_recycler);
ButterKnife.bind(this);
initToolBar();
initRecyclerView();
}
private void initRecyclerView() {
datas = new ArrayList<>();
for (int i = 0; i < 21; ) {
datas.add("Item" + ++i);
}
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
adapter = new InteractiveAdapter(this, this);
adapter.setData(datas);
mRecyclerView.setAdapter(adapter);
//条目触摸辅助类
ItemTouchHelper.Callback callBack = new MyItemTouchHelpCallback(adapter);
touchHelper = new ItemTouchHelper(callBack);
touchHelper.attachToRecyclerView(mRecyclerView);
}
@Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);
}
/**
* Adapter中logo设置了拖拽监听,让ItemTouchHelper去处理
*
* @param viewHolder
*/
@Override
public void onItemDrag(RecyclerView.ViewHolder viewHolder) {
touchHelper.startDrag(viewHolder);
}
}
public interface ItemDragListener {
void onItemDrag(RecyclerView.ViewHolder viewHolder);
}
0 0
- RecyclerView系列之三:使用ItemTouchHelper实现RecyclerView的条目交互特效
- RecyclerView之使用ItemTouchHelper实现交互动画
- RecyclerView之使用ItemTouchHelper和ItemTouchHelper.Callback实现条目拖拽排序
- Android ItemTouchHelper实现RecyclerView交互动画
- ItemTouchHelper实现RecyclerView条目拖拽移动、滑动删除
- Android使用ItemTouchHelper实现RecyclerView的item拖动位置交换
- RecyclerView爱恨情仇之ItemTouchHelper
- RecyclerView使用ItemTouchHelper
- ItemTouchHelper 使用RecyclerView打造可拖拽的GridView
- Android使用ItemTouchHelper打造可拖拽的RecyclerView
- RecyclerView打造可拖拽的GridView使用ItemTouchHelper
- RecyclerView ItemTouchHelper
- RecyclerView使用ItemTouchHelper实现拖拽和侧滑删除
- 使用ItemTouchHelper和RecyclerView实现拖拽移动效果
- recyclerview实现多条目
- 使用ItemTouchHelper类轻松实现RecyclerView的拖拽和侧滑
- RecyclerView的基本使用、RecyclerView万能adapter及多条目的实现
- 利用 ItemTouchHelper 实现 RecyclerView 的侧滑删除
- java虚拟机和内存管理
- 动态规划_最长公共子序列问题
- Android动画进阶—使用开源动画库nineoldandroids
- AppDelegate中的常用方法使用说明
- linux sensor 驱动之 psensor(proximity-sensor距离传感器)
- RecyclerView系列之三:使用ItemTouchHelper实现RecyclerView的条目交互特效
- 抽象类
- 在使用mstsc时发送ctrl+alt+del
- ubuntu 14.04 窗口四周出现很大的黑边
- pgsql中序列函数 nextval(regclass)、currval(regclass)、lastval()、setval(regclass, bigint)、setval(regclass
- Swift2.3适配Swift3.0
- django项目导入Eclipse运行调试
- 使用Fiddler对手机进行抓包
- angular2.0使用组件样式