RecyclerView 简单使用
Contents
RecyclerView
这个 View
的使用当初我用的不是很明白,现在有点懂了,我们自顶向下设计 View
代码总览
在 MainActivity
中,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
List<Integer> data = Stream.iterate(1, n -> n + 1).limit(100).collect(Collectors.toList());
CustomAdapter adapter = new CustomAdapter(data);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 4);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(layoutManager);
}
我们
- 定义了一个
RecyclerView
- 定义了一个
CustomAdapter
- 为
CustomAdapter
提供了数据 - 为
RecyclerView
设置adapter
- 为
RecyclerView
设置layoutmanager
注意,这里我们没用到 ViewHolder
这个东西,这个东西由 Adapter
操纵,相当于
RecyclerView
Adapter
ViewHolder
ViewHolder
ViewHolder
ViewHolder
有关Adapter
定义 Adapter
需要继承 RecyclerView.Adapter
,他的作用是衔接 RecyclerView
与 ViewHolder
,即 RecyclerView
通过
Adapter
来设置每个 ViewHolder
的视图,这里我们需要设置三个关键方法
onCreateViewHolder
每当RecyclerView
需要创建新的 ViewHolder 时,它都会调用此方法n 此方法会创建并初始化ViewHolder
及其关联的View
,但不会填充视图的内容,因为ViewHolder
此时尚未绑定到具体数据。onBindViewHolder
RecyclerView
调用此方法将ViewHolder
与数据相关联getItemCount
RecyclerView
调用此方法来获取数据集的大小
这里我们为 Adapter
设置私有数据 data
public class CustomAdapter extends RecyclerView.Adapter<CustomViewHolder> {
private List<Integer> data;
public CustomAdapter(List<Integer> data) {
this.data = data;
}
@NonNull
@Override
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new CustomViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
holder.setText(String.format("this is item %d", data.get(position)));
}
@Override
public int getItemCount() {
return data.size();
}
}
由于上面的代码使用到了 ViewHolder
,也要看下面的代码才能理解
有关ViewHolder
ViewHolder
用来表示一个布局,因此需要为其设置布局和类代码,这里随便布局一下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
public class CustomViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public CustomViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textview);
}
public void setText(String text) {
textView.setText(text);
}
}
在 ViewHolder
中,我们
- 为其定义了一个私有变量
TextView
- 定义了一个
setText
来设置TextView
的显示 - 外部可以使用
setText
来设置布局的显示,看Adapter
的代码
至此,相关代码已完成编写,可以运行了