概述
RecyclerView是什么
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。
初步使用的步骤
- build.gradle中添加所需依赖
implementation 'com.android.support:recyclerview-v7:27.1.1'
- xml文件中添加控件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
-
创建适配器Adapter
-
创建Adapter继承自RecyclerView.Adapter< ViewHolder >
-
ViewHolder为自己创建的内部类继承自RecyclerView.ViewHolder
-
必须实现
-
onCreateViewHolder(@NonNull ViewGroup parent, int viewType)方法
创建RecyclerView的子cell布局 -
onBindViewHolder(@NonNull ViewHolder holder, int position)方法
完成数据绑定等 -
getItemCount()获取数据总条目
-
子cell布局如下:
-
<?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"
android:orientation="horizontal">
<ImageView
android:layout_marginStart="16dp"
android:src="@mipmap/ic_launcher"
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_gravity="center_vertical"
android:text="@string/app_name"
android:id="@+id/title"
android:gravity="center"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
</LinearLayout>
View root = LayoutInflater.from(context).inflate(R.layout.cell_item, parent, false);
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> implements View.OnClickListener,
View.OnLongClickListener {
private List<Data> dataList;
private Context context;
private Data data;
private OnItemClickListener<Data> listener;
public void setListener(OnItemClickListener<Data> listener) {
this.listener = listener;
}
public static abstract class AdapterOnClickListenerImpl implements OnItemClickListener<Data> {
@Override
public void onItemClicked(ViewHolder holder, Data o) {
}
@Override
public void onItemLongClicked(ViewHolder holder, Data o) {
}
}
@Override
public void onClick(View v) {
ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
if (this.listener != null) {
int position = holder.getAdapterPosition();
this.listener.onItemClicked(holder, dataList.get(position));
}
}
@Override
public boolean onLongClick(View v) {
ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
if (this.listener != null) {
int position = holder.getAdapterPosition();
this.listener.onItemLongClicked(holder, dataList.get(position));
}
return true;
}
public interface OnItemClickListener<Data> {
void onItemClicked(ViewHolder holder, Data data);
void onItemLongClicked(ViewHolder holder, Data data);
}
public Adapter(List<Data> dataList, Context context) {
this.dataList = dataList;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View root = LayoutInflater.from(context).inflate(R.layout.cell_item, parent, false);
ViewHolder holder = new ViewHolder(root);
root.setTag(R.id.tag_recycler_holder, holder);
root.setOnClickListener(this);
root.setOnLongClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Data dt = dataList.get(position);
holder.title.setText(dt.getTitle());
}
@Override
public int getItemCount() {
return dataList.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView title;
public ViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.image);
title = itemView.findViewById(R.id.title);
}
}
}
-
找到并初始化RecyclerView
-
设置布局管理器,RecyclerView的显示方式在此设置
-
初始化适配器-初始化数据
-
设置适配器
public class MainActivity extends AppCompatActivity {
private RecyclerView recycler;
private List<Data> dataList;
private Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycler = findViewById(R.id.recycler);
initData();
adapter = new Adapter(dataList,this);
recycler.setLayoutManager(new LinearLayoutManager(this));
recycler.setAdapter(adapter);
adapter.setListener(new Adapter.AdapterOnClickListenerImpl() {
@Override
public void onItemClicked(Adapter.ViewHolder holder, Data o) {
Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClicked(Adapter.ViewHolder holder, Data o) {
Toast.makeText(MainActivity.this,"onLongClick",Toast.LENGTH_SHORT).show();
}
});
}
private void initData() {
dataList = new ArrayList<>();
for (int i = 0;i<5;i++){
Data data = new Data();
data.setTitle("title--->"+i);
dataList.add(data);
}
}
}
简单使用如上
给RecyclerView的子item添加长按事件以及点击事件
- 在adapter中添加监听的回调接口
public interface OnItemClickListener<Data> {
/**
* @param holder holder
* @param data 数据
*/
void onItemClicked(ViewHolder holder, Data data);
/**
* @param holder holder
* @param data 数据
*/
void onItemLongClicked(ViewHolder holder, Data data);
}
- Adapter中添加接口实例并添加set方法
private OnItemClickListener<Data> listener;
public void setListener(OnItemClickListener<Data> listener) {
this.listener = listener;
}
- Adapter实现View.OnClickListener, View.OnLongClickListener
- 将item的点击事件转交给自己设置的监听接口
@Override
public void onClick(View v) {
ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
if (this.listener != null) {
int position = holder.getAdapterPosition();
this.listener.onItemClicked(holder, dataList.get(position));
}
}
@Override
public boolean onLongClick(View v) {
ViewHolder holder = (ViewHolder) v.getTag(R.id.tag_recycler_holder);
if (this.listener != null) {
int position = holder.getAdapterPosition();
this.listener.onItemLongClicked(holder, dataList.get(position));
}
return true;
}
- 设置adapter前添加监听
adapter.setListener(new Adapter.AdapterOnClickListenerImpl() {
@Override
public void onItemClicked(Adapter.ViewHolder holder, Data o) {
Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClicked(Adapter.ViewHolder holder, Data o) {
Toast.makeText(MainActivity.this,"onLongClick",Toast.LENGTH_SHORT).show();
}
});
}
- 以上方法每次使用时都必须实现2个点击的方法,做出如下优化->根据业务实现有用的监听
- 在Adapter中添加
public static abstract class AdapterOnClickListenerImpl implements OnItemClickListener<Data> {
@Override
public void onItemClicked(ViewHolder holder, Data o) {
}
@Override
public void onItemLongClicked(ViewHolder holder, Data o) {
}
}