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);
}
}