RecyclerView ItemTouchHelper源码分析扩展

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值