1,是v7包中的添加依赖 “com.android.support:recyclerview-v7:25.3.1”
2, ItemTouchHelper类
作用:实现Recyclerview 拖着效果
用于和用户进行交换的主要的 CallBack 一起使用的效果
用户自定义CallBack:
getMoveemtnFlag(recyclerView recyclerView, RecyclerView v)
定义的一个的一个接口 面向对象的接口
boolean onItemMove(int fromPosition, int targetPos);
void ItemSwitped(int apapterPosition);
动画:
2 类
1,上下移动, move
2,左右 swipe
原理:
第一部分: 手指没有和屏幕分离
第二部分: 手指和屏幕分离
注意
2,ItemTouchHelper 的源码分析
1,attchToRecyclerView方法
2,setupCallbacks方法是绑定方法
中addItemDecoration(this)不是分割线
误区:ItemDecoration!等于分割线
addonItemTouchListener()监听事件
oninterceptTouchEvent() 手指的和屏幕分离的时候的
MotionEvent.ACTION_MOVE 干什么
移动view
moveIfNecessary()计算偏移量
ViewCompat.postOnAnimation(Recycle,this);递归的view 相当于handler.postOnAnimation(this)
view.postOnAnimation()
如果onDraw()
MessageItemTouchCallBack.java
package com.recy.activity;
import android.graphics.Canvas;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
/**
* 作者: songli
* QQ : 2734030745
* on 2017/6/28 0028下午 1:34.
* 邮箱: 15850774503@163.com
*/
public class MessageItemTouchCallBack extends ItemTouchHelper.Callback {
private static final String TAG = "MessageItemTouchCallBack";
private ItemTouchHelperAdapterCallback adapter;
public MessageItemTouchCallBack(ItemTouchHelperAdapterCallback adapter) {
this.adapter = adapter;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//callback回调监听那些动作? --判断方向
//makeMoveemntFlgs(UP | DOWN , LEFT);
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN ;
int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//监听滑动(水平方向, 树枝方向
//数据集合中的的两个数据进行位置交换
//同时还要刷新RecyclerView
adapter.onTiemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public boolean isLongPressDragEnabled() {
// TODO Auto-generated method stub
return true;
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
boolean isCurrentlyActive) {
Log.d(TAG, "onChildDraw");
// 实现一些动画
//条件:侧滑动作
// if(actionState==ItemTouchHelper.ACTION_STATE_SWIPE){
// //dX: 0~WIDTH
// float alpha = 1-Math.abs(dX)/viewHolder.itemView.getWidth();
// viewHolder.itemView.setAlpha(alpha);//1~0
// viewHolder.itemView.setScaleX(Math.max(0.75f,alpha));
// viewHolder.itemView.setScaleY(Math.max(0.75f,alpha));
// if(alpha<=0){
// viewHolder.itemView.setAlpha(1);//1~0
// viewHolder.itemView.setScaleX(1);
// viewHolder.itemView.setScaleY(1);
// }
// }
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState,
isCurrentlyActive);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//滑动删除的动作的时候回调
//1,删除数据集合里面的position位置的数据
//2,刷新apadter
adapter.onItemSwiped(viewHolder.getAdapterPosition());
}
//滑动消失的距离,当滑动小于这个值的时候会删除这个item,否则不会视为删除
@Override
public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
return 0.1f;
}
@Override
public float getSwipeEscapeVelocity(float defaultValue) {
return 5f;
}
//设置手指离开后ViewHolder的动画时间
@Override
public long getAnimationDuration(RecyclerView recyclerView, int animationType, float animateDx, float animateDy) {
return 100;
}
//网格型RecyclerView
@Override
public float getMoveThreshold(RecyclerView.ViewHolder viewHolder) {
return 0.9f;
}
//返回值决定是否有滑动操作
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
}
数据实体类 QQMessage.java
package com.recy.activity;
/**
*数据实体类
* 作者: songli
* QQ : 2734030745
* on 2017/6/28 0028下午 12:42.
* 邮箱: 15850774503@163.com
*/
public class QQMessage {
private int logo;
private String name;
private String lastMsg;
private String time;
private int pop;
public QQMessage() {
}
public QQMessage(int logo, String name, String lastMsg, String time) {
this.logo = logo;
this.name = name;
this.lastMsg = lastMsg;
this.time = time;
}
public QQMessage(int logo, String name, String lastMsg, String time, int pop) {
this.logo = logo;
this.name = name;
this.lastMsg = lastMsg;
this.time = time;
this.pop = pop;
}
public int getLogo() {
return logo;
}
public void setLogo(int logo) {
this.logo = logo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastMsg() {
return lastMsg;
}
public void setLastMsg(String lastMsg) {
this.lastMsg = lastMsg;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public int getPop() {
return pop;
}
public void setPop(int pop) {
this.pop = pop;
}
@Override
public String toString() {
return "QQMessage{" +
"logo=" + logo +
", name='" + name + '\'' +
", lastMsg='" + lastMsg + '\'' +
", time='" + time + '\'' +
", pop=" + pop +
'}';
}
}
3,StartDragListener.java
package com.recy.activity;
import android.support.v7.widget.RecyclerView;
/**
* 作者: songli
* QQ : 2734030745
* on 2017/6/28 0028下午 12:52.
* 邮箱: 15850774503@163.com
*/
public interface StartDragListener {
public void onStartDrag(RecyclerView.ViewHolder viewHolder);
}
ItemTouchHelperAdapterCallback.java
package com.recy.activity;
/**
* 作者: songli
* QQ : 2734030745
* on 2017/6/28 0028下午 1:19.
* 邮箱: 15850774503@163.com
*/
public interface ItemTouchHelperAdapterCallback {
/**
* 当拖拽的时候回调
* @param fromPosition
* @param toPosition
* @return
*/
boolean onTiemMove(int fromPosition, int toPosition);
/**
* 当伺候删除动作的时候回调
* @param adapterPosition
*/
void onItemSwiped(int adapterPosition);
}
MessageAdapter.java
package com.recy.activity;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;
/**
* 作者: songli
* QQ : 2734030745
* on 2017/6/28 0028下午 12:49.
* 邮箱: 15850774503@163.com
*/
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MyHolder> implements ItemTouchHelperAdapterCallback {
private static final String TAG = "MessageAdapter";
private List<QQMessage> list;
private StartDragListener dragListener;
public MessageAdapter(List<QQMessage> list, StartDragListener dragListener) {
this.list = list;
this.dragListener = dragListener;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem,parent, false);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(final MyHolder holder, int position) {
QQMessage qqMessage = list.get(position);
holder.iv_logo.setImageResource(qqMessage.getLogo());
holder.tv_name.setText(qqMessage.getName());
holder.tv_lastMsg.setText(qqMessage.getLastMsg());
holder.tv_time.setText(qqMessage.getTime());
holder.iv_logo.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//专递事件
// ItemTouchHelper
if (event.getAction() == MotionEvent.ACTION_DOWN)
dragListener.onStartDrag(holder);
Log.d(TAG,"interface------->onStartDrag");
return false;
}
});
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public boolean onTiemMove(int fromPosition, int toPosition) {
//数据集合中的两个数据进行位置交换
Collections.swap(list, fromPosition, toPosition);
//同时还要刷新RecyclerView
//notifyDataSetChanged();
notifyItemMoved(fromPosition, toPosition);
Log.d(TAG,"onTimeMove");
return false;
}
@Override
public void onItemSwiped(int adapterPosition) {
//1,删除数据集合里面的position位置的数据
list.remove(adapterPosition);
//2.刷新adapter
notifyItemRemoved(adapterPosition);
}
class MyHolder extends RecyclerView.ViewHolder
{
public ImageView iv_logo;
public TextView tv_name;
public TextView tv_time;
public TextView tv_lastMsg;
public MyHolder(View itemView) {
super(itemView);
iv_logo = (ImageView) itemView.findViewById(R.id.iv_logo);
tv_name = (TextView) itemView.findViewById(R.id.tv_name);
tv_time = (TextView) itemView.findViewById(R.id.tv_time);
tv_lastMsg = (TextView) itemView.findViewById(R.id.tv_lastMsg);
}
}
}
MainActivity.java
package com.recy.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.util.SortedList;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import java.util.List;
public class MainActivity extends AppCompatActivity implements StartDragListener{
private RecyclerView recyclerView;
private ItemTouchHelper itemTouchHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView)findViewById(R.id.recyclerview);
List<QQMessage> list = DataUtils.init(); //初始化信息
MessageAdapter adapter = new MessageAdapter(list, (StartDragListener) this);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
ItemTouchHelper.Callback callback = new MessageItemTouchCallBack(adapter);
itemTouchHelper = new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(recyclerView);
}
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
itemTouchHelper.startDrag(viewHolder);
}
}