美文网首页
使用RecyclerView和ItemTouchHelper实现

使用RecyclerView和ItemTouchHelper实现

作者: ryanxun | 来源:发表于2019-06-26 09:59 被阅读0次

这是一个使用RecyclerView,做的一个排序例子,利用到ItemTouchHelper,实现手势识别功能

我们首先需要引RecyclerView jar包,

6.png

然后我们在Activity中使用RecyclerView


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".adddelete.AddActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/addrv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

接下来开始操作!
我们首先需要一个ItemTouchHelperAdapter的接口


package com.example.ryan.itemtouch.adddelete;

public interface IOperationData {
    /**
     * 数据交换
     * @param fromPosition
     * @param toPosition
     */
    void onItemMove(int fromPosition,int toPosition);

    /**
     * 数据删除
     * @param position
     */
    void onItemDissmiss(int position);
}

在接口中生死线数据变换和删除的功能
然后我们重写RecyclerViewAdapter

package com.example.ryan.itemtouch.adddelete;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.ryan.itemtouch.R;
import com.example.ryan.itemtouch.simple.SimpleAdapterDemo;

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

public class AddAdapterDemo extends RecyclerView.Adapter<AddAdapterDemo.DragViewHolder> implements IOperationData {
    private Context context;
    private List<String> list;

    //
    public AddAdapterDemo(Context context, List<String> list) {
       this.context=context;
       this.list=list;
    }

    @NonNull
    @Override
    public DragViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        return new DragViewHolder(LayoutInflater.from(context).inflate(R.layout.item_move,viewGroup,false));
    }

    @Override
    public void onBindViewHolder(@NonNull DragViewHolder dragViewHolder, int i) {
        dragViewHolder.tv_move.setText(list.get(i));
    }

    @Override
    public int getItemCount() {
//        mDataList == null ? 0 : mDataList.size()
        return  list == null ? 0 : list.size();
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        //交换位置
        Collections.swap(list,fromPosition,toPosition);
        notifyItemMoved(fromPosition,toPosition);

    }

    @Override
    public void onItemDissmiss(int position) {
        //移除数据
        list.remove(position);
        notifyItemRemoved(position);

    }

    //创建ViewHolder
    public class DragViewHolder extends RecyclerView.ViewHolder {
        TextView tv_move;
        public DragViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_move=itemView.findViewById(R.id.tv_move);
        }
    }
}

我们还需要重写一个ItemTouchHelper

package com.example.ryan.itemtouch.adddelete;

import android.graphics.Canvas;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;

public class TouchHelperDemo extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
    private AddAdapterDemo addAdapterDemo;

    public TouchHelperDemo(AddAdapterDemo addAdapterDemo) {
        this.addAdapterDemo=addAdapterDemo;
    }

    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        //允许上下得拖动
        int dragFlags= android.support.v7.widget.helper.ItemTouchHelper.UP| android.support.v7.widget.helper.ItemTouchHelper.DOWN;
        //允许左右拖动
        int swipeFlags = android.support.v7.widget.helper.ItemTouchHelper.RIGHT|android.support.v7.widget.helper.ItemTouchHelper.LEFT;
        return makeMovementFlags(dragFlags,swipeFlags);
    }

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
        addAdapterDemo.onItemMove(viewHolder.getAdapterPosition(),viewHolder1.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        addAdapterDemo.onItemDissmiss(viewHolder.getAdapterPosition());

    }
    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        if(actionState == android.support.v7.widget.helper.ItemTouchHelper.ACTION_STATE_SWIPE) {
            //滑动时改变Item的透明度
            final float alpha = 1 - Math.abs(dX) / (float)viewHolder.itemView.getWidth();
            viewHolder.itemView.setAlpha(alpha);
        }
    }
}

最后MainActivity开始引入

package com.example.ryan.itemtouch.adddelete;

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 com.example.ryan.itemtouch.R;

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

public class AddActivity extends AppCompatActivity {
    private RecyclerView addrv;
    private AddAdapterDemo adapterDemo;
    private List<String> list;
    private TouchHelperDemo touchHelperDemo;
    private ItemTouchHelper.Callback callback;
    private ItemTouchHelper itemTouchHelper;



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

        initView();
    }

    private void initView() {
        addrv = findViewById(R.id.addrv);
        List<String> list= new ArrayList<>();
        for (int i = 0; i < 18; i++) {
            list.add("Index " + i);
        }

        adapterDemo=new AddAdapterDemo(this,list);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        callback = new TouchHelperDemo(adapterDemo);
        addrv.setAdapter(adapterDemo);
        addrv.setLayoutManager(manager);
        itemTouchHelper = new ItemTouchHelper(callback);
        itemTouchHelper.attachToRecyclerView(addrv);

    }


}


相关文章

网友评论

      本文标题:使用RecyclerView和ItemTouchHelper实现

      本文链接:https://www.haomeiwen.com/subject/uqrqcctx.html