RecyclerView 简单实现拖拽和滑动

recyclerview 拖拽和滑动的简单实现

1、ItemTouchHelper.SimpleCallback

ItemTouchHelper.SimpleCallback 是 ItemTouchHelper的一个简单实现类 通过这个类 我们可以非常方面的实现拖拽和滑动。
比如:
ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(int dragDirs, int swipeDirs)
dragDirs支持四个值

ItemTouchHelper.UP |  ItemTouchHelper.DOWN|ItemTouchHelper.lEFT| ItemTouchHelper.RIGHT
swipeDirs也是支持四个值  
ItemTouchHelper.lEFT| ItemTouchHelper.RIGHT|  ItemTouchHelper.START| ItemTouchHelper.END
例如:
ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP| ItemTouchHelper.RIGHT| ItemTouchHelper.LEFT, ItemTouchHelper.RIGHT|ItemTouchHelper.LEFT | ItemTouchHelper.START
        |ItemTouchHelper.END) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {}
           @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {}
        };

这里 我们需要实现 两个抽象方法 onMove 和 onSwiped
onMove方法里面写上两个对象的交换,然后调用adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
返回true
比如:

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                Collections.swap(datas, viewHolder.getAdapterPosition(), target.getAdapterPosition());
                adapter.notifyItemMoved(viewHolder.getAdapterPosition(),  target.getAdapterPosition());
                return true;
            }

在onSwiped方法中从数据集里面删除滑动的对象 然后调用
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());

例如:

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                datas.remove(viewHolder.getAdapterPosition());
                adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
            }

最后通过ItemTouchHelper的attachToRecyclerView方法管理recyclerview
例如:
ItemTouchHelper helper = new ItemTouchHelper(callback);
helper.attachToRecyclerView( mRecyclerView);
到此 一个简单的拖拽和滑动就实现了

当然 我们还是得实现一点小小的动画 比如在进行拖拽的时候,被拖拽的那个item应该背景颜色变得和其他item不一样并且这个item会进行缩放,那么我们就得重写onSelectedChanged方法
比如 :

@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if (viewHolder != null){
                    viewHolder.itemView.setScaleX(1.5F);
                  viewHolder.itemView.setScaleY(1.5F);
                  viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
                }

当拖拽完成后,将其变回原来的样子 重写clearView方法
比如

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
                viewHolder.itemView.setScaleX(1F);
                viewHolder.itemView.setScaleY(1F);
            }

当我们在进行滑动删除的时候 我们希望在删除的时候 透明度能变高
那么我们得重写onChildDraw方法
比如

@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){
                    final float alpha = 1.0f - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
                    viewHolder.itemView.setAlpha(alpha);
                    viewHolder.itemView.setTranslationX(dX);
                }
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }

下面是这个demo的主要源码

package com.simple.sliderecyclerview;

import android.graphics.Canvas;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.Collections;

public class MainActivity extends AppCompatActivity{

    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private ArrayList<String> datas = new ArrayList<>();

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

        final MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(datas);
        mRecyclerView = (RecyclerView) findViewById(R.id.recylerview);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setAdapter(adapter);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
        ItemTouchHelper.Callback callback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.DOWN | ItemTouchHelper.UP
                | ItemTouchHelper.RIGHT| ItemTouchHelper.LEFT, ItemTouchHelper.RIGHT| ItemTouchHelper.LEFT | ItemTouchHelper.START
        |ItemTouchHelper.END) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                Collections.swap(datas, viewHolder.getAdapterPosition(), target.getAdapterPosition());
                adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                datas.remove(viewHolder.getAdapterPosition());
                adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if (viewHolder != null){
                    viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
                    viewHolder.itemView.setScaleX(1.5F);
                    viewHolder.itemView.setScaleY(1.5F);
                }
            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                viewHolder.itemView.setBackgroundColor(Color.TRANSPARENT);
                viewHolder.itemView.setScaleX(1F);
                viewHolder.itemView.setScaleY(1F);
            }

            @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){
                    final float alpha = 1.0f - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
                    viewHolder.itemView.setAlpha(alpha);
                    viewHolder.itemView.setTranslationX(dX);
                }
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        };
        ItemTouchHelper helper = new ItemTouchHelper(callback);
        helper.attachToRecyclerView( mRecyclerView);

    }

    public void initdata(){
        for (int i = 0 ; i < 21; i++){
            datas.add("Text    " + i);
        }
    }
}

至于其他的功能就靠大家自己发掘了。或者大家可以不用ItemTouchHelper.SimpleCallback,直接写一个ItemTouchHelper.CallBack的子类 ,去实现其中的方法,具体的就不介绍了,可以去参考大神写的https://github.com/iPaulPro/Android-ItemTouchHelper-Demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值