RecyclerView:优于ListView的一个List显示工具,较ListView复杂一些,但是代码套路比较固化。RecyclerView有三种模式,ListView(列表形式),StaggeredView(瀑布形式),GridView(表格形式)这里先用ListView做一个简单的阐述,之后再细说三种形式其实三种形式大致相同共通性强
使用步骤: 定义并设置Adapter适配器,定义设置LayoutManager布局管理器。
使用准备:设置 itemViewLayout 和 mainlayout 以及数据和一个 项目单位类 此处使用listView简单阐述
itemView如下效果
mainlayout如下效果
数据(略)
单位项目类
package com.example.recyclerviewreview;
import android.widget.TextView;
public class Sample {
private String tv_name;
private String tv_content;
private int icon;
public String getTv_name() {return tv_name;}
public void setTv_name(String tv_name) {this.tv_name = tv_name;}
public String getTv_content() {return tv_content;}
public void setTv_content(String tv_content) {this.tv_content = tv_content;}
public int getIcon() {return icon;}
public void setIcon(int icon) {this.icon = icon;}
}
一、创建Adapter(需要一个新的类)
每一个RecyclerView都需要一个适配器,适配器的作用便是把数据和布局联系在一起,当然Adapter的设置也是RecyclerView的重点
package com.example.recyclerviewreview;
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.ArrayList;
import java.util.List;
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListHolder> {
TextView tv_name;
TextView tv_content;
ImageView iv_icon;
List<Sample> sampleList;
//定义Adapter首先需要一个ViewHolder(用来装布局控件,连接布局控件的容器)这里定义的ListHolder继承自ViewHolder需要把ItemLayout里的控件连接到 ListHolder用id的方式连接,放入ViewHolder里
class ListHolder extends RecyclerView.ViewHolder {
public ListHolder(@NonNull View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.list_name);
tv_content = itemView.findViewById(R.id.list_content);
iv_icon = itemView.findViewById(R.id.list_icon);
}
//构造函数,通过List<Sample>来把参数传入ListAdapter这也是ListAdapter唯一接受外来数据的方法
public ListAdapter(List<Sample> sampleList) {
this.sampleList = sampleList;
}
//完成自定义Adapter的三个自带函数 1、onCreateViewHolder(@NonNull ViewGroup parent, int viewType)这个函数用来创建ListAdapter所需的 ViewHolder 首先用inflate方法解析布局,把整个布局传入,再通过ViewHolder把这个布局里的每个控件设置进来
@NonNull
@Override
public ListHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View sampleview = View.inflate(parent.getContext(),R.layout.layout_list,null);
ListHolder listHolder = new ListHolder(sampleview);
return listHolder;
}
//完成自定义Adapter的三个自带函数 2、onBindViewHolder(@NonNull ListHolder holder, int position)这个函数用来设置布局控件应该放单位项目类 中的哪些数据,通过position获取此时的数据列表位置之后再定义一个setData函数来设置布局里的各个控件应该与单位项目类的哪些数据相连接
@Override
public void onBindViewHolder(@NonNull ListHolder holder, int position) {
holder.setData(sampleList.get(position));
}
//可以看到这里给每个控件设置对应的项目数据
public void setData(Sample sample) {
tv_content.setText(sample.getTv_content());
tv_name.setText(sample.getTv_name());
iv_icon.setImageResource(sample.getIcon());
}
//完成自定义Adapter的三个自带函数 3、getItemCount() 这个参数旨在传递数据列表大小较为简单直接返回size即可
@Override
public int getItemCount() {
if (sampleList != null) {
return sampleList.size();
}
return 0;
}
}
}
二、设置layoutManager和自定义的ListAdapter
**ListView的LayoutManager采用LinearLayoutManager **
StaggeredView的LayoutManager采用StaggeredGridManager
GridView的LayoutManager采用GridLayoutManager
ListAdapter listAdapter = new ListAdapter(sampleList);
LinearLayoutManager layoutManager = new LinearLayoutManager(null);
recyclerView.setAdapter(listAdapter);
recyclerView.setLayoutManager(layoutManager);
三、设置数据(数据导入单位项目类)
private void initData() {
sampleList = new ArrayList<>();
for (int i=0 ; i<Datas.content.length ; i++) {
Sample sample = new Sample();
sample.setIcon(Datas.icons[i]);
sample.setTv_content(Datas.content[i]);
sample.setTv_name(Datas.names[i]);
sampleList.add(sample);
}
}
这样整个recyclerView就设置完毕了
效果如图: