Use of RecycleView and swap item position and slide left to delete

Guide package

implementation ‘com.android.support:recyclerview-v7:27.1.1’

Layout in the main page

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_height="match_parent"
    tools:context=".MainActivity">


    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv"></androidx.recyclerview.widget.RecyclerView>

</LinearLayout>

Entity class

package com.fenghongzhang.recycleview;

/**
 * 实体类
 */
public class Fruit {
    
    

    private String name;
    private int imageId;

    public Fruit(String name, int imageId){
    
    
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
    
    
        return name;
    }

    public int getImageId() {
    
    
        return imageId;
    }
}

Layout in RecycleView adaptation

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    >
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_image"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_name"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>

</LinearLayout>

Adapter for RecycleView

package com.fenghongzhang.recycleview;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

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

/**
 * 最重要的适配器
 */
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> implements ItemTouchHelperAdapter{
    
    

    //数据源
    private List<Fruit> list;

    public FruitAdapter(List<Fruit> list) {
    
    
        this.list = list;
    }

    /**
     * 自定义接口交换item的方法
     * @param from 要交换的位置
     * @param to 交换后的位置
     */
    @Override
    public void onItemMove(int from, int to) {
    
    
        Collections.swap(list,from,to);
        notifyItemMoved(from,to);
    }

    /**
     * 根据位置删除
     * @param position
     */
    @Override
    public void onDismiss(int position) {
    
    
        list.remove(position);
        notifyItemRemoved(position);
    }

    /**
     * Holder
     */
    static class ViewHolder extends RecyclerView.ViewHolder{
    
    
        //布局中的组件
        ImageView fruitImg;
        TextView fruitName;

        //查找布局中的组件并赋值
        public ViewHolder(@NonNull View itemView) {
    
    
            super(itemView);
            fruitImg = itemView.findViewById(R.id.fruit_image);
            fruitName = itemView.findViewById(R.id.fruit_name);
        }
    }

    /**
     * 创建ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public FruitAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_layout, null);
        return new ViewHolder(inflate);
    }

    /**
     * 给ViewHolder的每一个项目赋值
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull FruitAdapter.ViewHolder holder, final int position) {
    
    
        Fruit fruit = list.get(position);
        holder.fruitImg.setImageResource(R.mipmap.tou);
        holder.fruitName.setText(fruit.getName());

        //组件中的点击事件.
        holder.fruitImg.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                list.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeRemoved(0,list.size());
            }
        });
    }

    /**
     * 数据源的大小
     * @return
     */
    @Override
    public int getItemCount() {
    
    
        return list.size();
    }
}

Swapped and deleted interfaces


package com.fenghongzhang.recycleview;

/**
 * 此接口是来定义交换和删除的方法的. 让适配器显示这个接口
 */
public interface ItemTouchHelperAdapter {
    
    
    /**
     * 交换item
     * @param from
     * @param to
     */
    void onItemMove(int from ,int to);

    /**
     * 删除item
     * @param position
     */
    void onDismiss(int position);
}

Specifically to show the swap and delete functions

package com.fenghongzhang.recycleview;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 此类是具体来显示交换和删除功能的
 */
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
    
    

    private FruitAdapter fruitAdapter;

    public SimpleItemTouchHelperCallback(FruitAdapter fruitAdapter) {
    
    
        this.fruitAdapter = fruitAdapter;
    }

    /**
     *
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
    
    

        int drawFlag = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipFlag = ItemTouchHelper.LEFT;

        /**
         * 第一个参数是能不能上下交换
         * 第一个参数是左删还是由删
         */
        return makeMovementFlags(drawFlag,swipFlag);
    }

    /**
     * 调用适配器中的交换的方法
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
    
    
        fruitAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
        return true;
    }

    /**
     * 调用适配器中删除的方法
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
    
    
        fruitAdapter.onDismiss(viewHolder.getAdapterPosition());
    }

    //是否长按,默认就是true
    @Override
    public boolean isLongPressDragEnabled() {
    
    
        return true;
    }

    //是否可以删除.默认就是true
    @Override
    public boolean isItemViewSwipeEnabled() {
    
    
        return true;
    }
}

Code in the main page

package com.fenghongzhang.recycleview;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

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

public class MainActivity extends AppCompatActivity {

    private RecyclerView rv;

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

        //网格布局管理器
//        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);

        //瀑布流管理器
//        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

        //线性布局管理器.
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        rv.setLayoutManager(linearLayoutManager);

        //数据源
        List<Fruit> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list.add(new Fruit("第" + i + "个", 0));
        }

        //设置适配器
        FruitAdapter fruitAdapter = new FruitAdapter(list);
        rv.setAdapter(fruitAdapter);

        /**
         * 此类是具体来显示交换和删除功能的
         */
        SimpleItemTouchHelperCallback simpleItemTouchHelperCallback = new SimpleItemTouchHelperCallback(fruitAdapter);
        //调用系统提供的ItemTouchHelper类,实现上下交换和删除
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchHelperCallback);
        //绑定recycleView
        itemTouchHelper.attachToRecyclerView(rv);


    }

    private void initView() {
        rv = (RecyclerView) findViewById(R.id.rv);
    }
}

Guess you like

Origin blog.csdn.net/shuai_ge_feng/article/details/113698498