RecyclerView
- 前言
- 一、依赖的导入
- 二、RecyclerView的Item视图编写
- 三、RecyclerView适配器的编写
-
- 1、设置返回的视图
- 2、设置数据绑定和返回数量
- 3、在控件中设置这个适配器
- 实现效果
- 总结
-
- 补充
前言
更多内容请访问酒易的个人博客
本章主要讲述RecyclerView的适配器的设置
一、依赖的导入
RecyclerView是需要导入依赖的,请添加以下代码:
二、RecyclerView的Item视图编写
这里主要设置了item的大小,以及,设置了里面两个数据的ID,当然还设置了颜色用来区分
三、RecyclerView适配器的编写
package com.example.uidesign;
import androidx.recyclerview.widget.RecyclerView;
//下面这些代码是报错的,先把这里的Adapter<>设置成Adapter<RecyclerViewItemTest.ViewHolder> 然后 , ALT+Enter后回车重写接口
public class RecyclerViewItemTest extends RecyclerView.Adapter<>{
public static class ViewHolder extends RecyclerView.ViewHolder{
}
}
重写后的代码是这个样子
//下面这些代码是报错的,先把这里的Adapter<>设置成Adapter<RecyclerViewItemTest.ViewHolder> 然后 , ALT+Enter后回车重写接口
public class RecyclerViewItemTest extends RecyclerView.Adapter<RecyclerViewItemTest.ViewHolder>{
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;//创建父容器视图,返回的也是一个父容器视图,意思就是到时候返回你能看到的视图
}
@NonNull
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//绑定父容器,这里可以用来给父容器中的子容器的控件也就是item设置东西,比如设置每一个控件的文本框设置成红色,或者设置成1111
}
@Override
public int getItemCount() {//这里的到item的count,也就是传入一个数据的数量大小
return 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public ViewHolder(@NonNull View itemView) {
//这里是子容器的方法,在这里可以通过这个itemView得到每个item也就是每个子容器中的控件
super(itemView);
}
}
}
这个时候我们的适配器就写好了,但是我们没有返回视图,没有返回数量,没有设置数据绑定,所以我们还得把这些补上。
1、设置返回的视图
这里是新建了View对象把item视图给创建出来了。然后将它设置成了ViewHolder并返回
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_test,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;//创建父容器视图,返回的也是一个父容器视图,意思就是到时候返回你能看到的视图
}
2、设置数据绑定和返回数量
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//绑定父容器,这里可以用来给父容器中的子容器的控件也就是item设置东西,比如设置每一个控件的文本框设置成红色,或者设置成1111
holder.item1.setText(stringList1.get(position));
holder.item2.setText(stringList2.get(position));
//这里就是可以用来设置控件的数据的地方
}
//这里设置数组来传递数据
private List<String> stringList1;
private List<String> stringList2;
//设置通过构造方法来的到数据
public RecyclerViewItemTest(List<String> stringList1, List<String> stringList2) {
this.stringList1 = stringList1;
this.stringList2 = stringList2;
}
@Override
public int getItemCount() {//这里的到item的count,也就是传入一个数据的数量大小
return stringList1.size();//这里返回数据的大小,返回的大小也是子控件数量的大小
}
public static class ViewHolder extends RecyclerView.ViewHolder{
//这里得到这些item里面的控件
public TextView item1;
public TextView item2;
public ViewHolder(@NonNull View itemView) {
//这里是子容器的方法,在这里可以通过这个itemView得到每个item也就是每个子容器中的控件
super(itemView);
item1 = itemView.findViewById(R.id.recycler_item);
item2 = itemView.findViewById(R.id.recycler_item1);
}
}
详细请看代码注释,这样,一个适配器就写好了。
3、在控件中设置这个适配器
此时我们来到主活动,拿到这个recyclerview进行设置
public class RecyclerviewTestActivity extends Activity {
private RecyclerView recyclerTest;
private List<String> stringList1 = new ArrayList<>();
private List<String> stringList2 = new ArrayList<>();
private RecyclerViewItemTest recyclerViewItemTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recyclerview_test);
//得到recyclerview控件对象
recyclerTest = findViewById(R.id.recycler);
//创建出适配器对象
recyclerViewItemTest = new RecyclerViewItemTest(stringList1, stringList2);
//recyclerview是需要设置视图管理的,这里设置了视图管理,然后新建了一个网格视图管理器,里面的参数是,一个上下文对象,一个是指垂直一行放多少个,第三个是设置水平方式,第四个设置是否翻转视图,一般选否
recyclerTest.setLayoutManager(new GridLayoutManager(this,2,RecyclerView.HORIZONTAL,false));
//设置完了视图管理就需要设置适配器了
recyclerTest.setAdapter(recyclerViewItemTest);
//此时string的数据内容都是空的,我们给他添加内容进去
for (int i = 0; i <10 ; i++) {
stringList1.add(i+"");
stringList2.add((i*10)+"");
}
/**
* 这里非常重要,当我们编写设置完了动态数据后需要更新数据,这里通过适配器对象的notifyDataSetChanged()方法更新数据。
*/
recyclerViewItemTest.notifyDataSetChanged();
}
实现效果
这是可以水平滑动的控件,我刚才在设置他的视图管理器的时候就写了,
这个被设置成了两行,水平的方式。
总结
- recyclerview主要可以用来设置一些横向滚动,提高了应用性。
- 适配器主要需要设置,父容器视图,绑定子容器的控件的设置,返回子控件的数量。
- 在主活动中通过recyclerview对象设置适配器的时候需要先设置适配器的视图管理,我一般使用的是网格管理,可以按下GLM可以快捷打出来。然后在设置适配器。
- 当动态数据被改变的时候需要更新适配器数据才能实时改变,所以要及时通过通知数据被改变的方法去更新数据。
补充
在item视图的父视图最好是用内容大小宽高,因为如果都是屏幕宽高他就真的占屏幕宽高