【笔记】Android控件RecyclerView

前言

Android控件RecyclerView学习笔记

添加gradle依赖

1
2
3
4
5
6
dependencies {

...

implementation 'androidx.recyclerview:recyclerview:1.1.0'
}

添加RecyclerView控件

/app/src/main/res/layout/activity\_main.xml
1
2
3
4
5
6
7
8
9
10
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

创建一个Bean类

  • 创建一个Bean类,用于创建列表元素对象
    • Bean的属性为name,用于定义列表元素的值
/app/src/main/java/.../Bean.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Bean {

private String name;

public Bean(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

自定义一个布局

  • 创建一个布局recycler_item.xml,用于存放列表内的元素
    • 布局内添加一个TextView控件,用于存放列表
/app/src/main/res/layout/recycler_item.xml
1
2
3
4
5
6
7
8
9
10
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

创建一个适配器类

  • 创建一个适配器类,继承RecyclerView.Adapter类,用于把列表中元素放到列表中
/app/src/main/java/.../MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private List<Bean> beans;
private Context context;

public MyAdapter(List<Bean> beans, Context context) {
this.beans = beans;
this.context = context;
}

// 获取当前布局对象
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = View.inflate(context, R.layout.recycler_item, null);
return new MyViewHolder(view);
}

// 绑定数据
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.textView.setText(beans.get(position).getName());
}

// 获取元素个数
@Override
public int getItemCount() {
return beans==null ? 0 : beans.size();
}

public final class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv);
}
}
}

实例化对象

  • 在主类中创建列表元素对象,并通过自定义的适配器,将列表元素渲染到列表中
/app/src/main/java/.../MyActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MainActivity extends AppCompatActivity {

// 创建一个存放多个列表元素的集合
private List<Bean> beans = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 创建多个列表元素对象,并添加到集合中
beans.add(new Bean("文本内容"));
...

// 获取列表对象
RecyclerView recyclerView = findViewById(R.id.rv);

// 设置布局为线性布局,默认为垂直布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);

// 使用适配器
MyAdapter myAdapter = new MyAdapter(beans, this);
recyclerView.setAdapter(myAdapter);
}
}

更多布局方式

线性布局

1
2
3
// 设置布局为垂直布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);

网格布局

<num>:设置列数

1
2
3
// 设置网格布局
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, <num>);
recyclerView.setLayoutManager(gridLayoutManager);

瀑布流布局

<num>:表示行或列的个数
1:表示纵向瀑布流

1
2
3
// 设置瀑布流布局
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(<num>, 1);
recyclerView.setLayoutManager(staggeredGridLayoutManager);

添加点击事件

/app/src/main/java/.../MyAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public final class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv);

itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (onItemClickListener != null) {
onItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
}

private OnRecyclerItemClickListener onItemClickListener;

public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener) {
onItemClickListener = listener;
}

public interface OnRecyclerItemClickListener {
void onRecyclerItemClick(int position);
}

/app/src/main/java/…/MyActivity.java

position:编号

1
2
3
4
5
6
myAdapter.setRecyclerItemClickListener(new MyAdapter.OnRecyclerItemClickListener() {
@Override
public void onRecyclerItemClick(int position) {
...
}
});

完成

参考文献

哔哩哔哩——Android架构解析