RecycleView实现侧滑和拖动

在研究recycleview,发现非常强大,简单的实现个功能
这里写图片描述

功能需求

  • 长按拖动,点击android图标拖动
  • 左右滑动删除item

功能很简单都是一些api的东西。没有太多讲的。直接上代码好了。

先看主函数的类

package example.com.recycleviewanimation;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements onDragStartListener {
    private List<String> mDatas;
    private RecyclerView recycleView;
    private ItemTouchHelper itemtouchhelper;
    private WhAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();

        recycleView = (RecyclerView) findViewById(R.id.recycleView);//初始化
        recycleView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));//定义样式

        adapter = new WhAdapter(this, mDatas);//初始化adapter
        recycleView.setAdapter(adapter);

        ItemTouchHelper.Callback callback = new WhItemTouchCallback(adapter);//初始化ItemTouchHelper.
        itemtouchhelper = new ItemTouchHelper(callback);
        itemtouchhelper.attachToRecyclerView(recycleView);//这个必须加上.让辅助类和recycleview关联上
    }

    protected void initData() {//数据
        mDatas = new ArrayList<String>();
        for (int i = 'A'; i < 'z'; i++) {
            mDatas.add("" + (char) i);
        }
    }

    @Override
    public void onStartDrag(RecyclerView.ViewHolder viewHolder) {//执行点击图标进行拖动的效果
        itemtouchhelper.startDrag(viewHolder);
    }
}

下面是adapter的方法

package example.com.recycleviewanimation;

import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Collections;
import java.util.List;

/**
 * Created by wanghao on 16/5/11.
 */
public class WhAdapter extends RecyclerView.Adapter<WhAdapter.MyHolder>
        implements ItemThouchHelperAdapterCallback {


    private final onDragStartListener startdraglistener;
    private List<String> mDatas;
    private LayoutInflater mInflater;

    public WhAdapter(Activity context, List<String> datas) {
        mInflater = LayoutInflater.from(context);
        mDatas = datas;
        this.startdraglistener = (onDragStartListener) context;
    }


    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        MyHolder holder = new MyHolder(mInflater.inflate(
                R.layout.item_home, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final MyHolder holder, final int position) {
        holder.tv.setText(mDatas.get(position));
        holder.iv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
//这里面当点击图片的时候 开始执行拖动。因为itemtouchhelper的startDrag方法需要一个viewholder。所以通过回调的方法吧holder传出去
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    startdraglistener.onStartDrag(holder);
                }
                return false;
            }
        });
    }


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


    class MyHolder extends RecyclerView.ViewHolder {

        TextView tv;
        ImageView iv;

        public MyHolder(View view) {
            super(view);
            tv = (TextView) view.findViewById(R.id.id_num);
            iv = (ImageView) view.findViewById(R.id.iv);

        }
    }

    //  两个接口回调的方法.来执行 移动和 删除之后的操作
    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        //        数据发生改变  两个数据交换位置
        Collections.swap(mDatas, fromPosition, toPosition);
        //        刷新数据
        notifyItemMoved(fromPosition, toPosition);
        return false;
    }

    @Override
    public void onItemSwiped(int adapterPosition) {
        //        1 删除集合positon中的而数据
        mDatas.remove(adapterPosition);
        //        2 刷新adapter
        notifyItemRemoved(adapterPosition);

    }

}

接口方法

package example.com.recycleviewanimation;

/**
 * Created by wanghao on 16/5/11.
 */
public interface ItemThouchHelperAdapterCallback {
    /**
     * 拖拽会掉
     *
     * @param fromPosition
     * @param toPosition
     * @return
     */
    boolean onItemMove(int fromPosition, int toPosition);

    /**
     * 侧滑删除
     *
     * @param adapterPosition
     */
    void onItemSwiped(int adapterPosition);
}

//另一个回调
package example.com.recycleviewanimation;

import android.support.v7.widget.RecyclerView;

/**
 * Created by wanghao on 16/5/11.
 */
public interface onDragStartListener {
    public void onStartDrag(RecyclerView.ViewHolder viewHolder);
}

recycleview提供了一个非常给力的 辅助类

ItemTouchHelper。

package example.com.recycleviewanimation;

import android.graphics.Canvas;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;

/**
 * Created by wanghao on 16/5/11.
 */
public class WhItemTouchCallback extends ItemTouchHelper.Callback {
    private final ItemThouchHelperAdapterCallback itemtouchcallback;

    public WhItemTouchCallback(ItemThouchHelperAdapterCallback itemtouchcallback) {//动画的返回接口
        this.itemtouchcallback = itemtouchcallback;
    }
    @Override
    public boolean isLongPressDragEnabled() {//可以进行长按拖动
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }//进行侧滑拖动

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//        callback监听那些动作?ItemTouchHelperItemTouchHelper--判断方向的
        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) {
//        监听滑动(垂直方向)
        itemtouchcallback.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return false;
    }
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//          滑动删除的动作的回调
        itemtouchcallback.onItemSwiped(viewHolder.getAdapterPosition());
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {//侧滑状态
//            属性动画搞起来  侧滑是让item有个变小的动画 在这里可以进行你所有想做的动画效果
            final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
            viewHolder.itemView.setAlpha(alpha);
            viewHolder.itemView.setScaleX((float) Math.max(0.7, alpha));
            viewHolder.itemView.setScaleY((float) Math.max(0.7, alpha));
            if (alpha <=0) {//让属性动画回复原状
                viewHolder.itemView.setAlpha(1);
                viewHolder.itemView.setScaleX(1);
                viewHolder.itemView.setScaleY(1);
            }
        }
        else {//让属性动画回复原状
            viewHolder.itemView.setAlpha(1);
            viewHolder.itemView.setScaleX(1);
            viewHolder.itemView.setScaleY(1);
        }

        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);

    }

    private static final String TAG = "WhItemTouchCallback";
}

为了解耦 弄了些接口的东西。没什么特殊的

demo在这尼:https://github.com/wanghao200906/recycleviewanimation

尊重原创http://blog.csdn.net/wanghao200906/article/details/51394462

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值