0%

RecyclerView

使用RecyclerView的步骤:

  1. 创建一个Adapter,继承自RecyclerView.Adapter
  2. 创建一个ViewHolder,继承自RecyclerView.ViewHolder
  3. 在Adapter中实现onCreateViewHolder和onBindViewHolder方法
  4. 在Activity中创建RecyclerView,设置LayoutManager和Adapter
  5. 在Activity中设置数据

Adapter

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
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<String> mData;

public MyAdapter(List<String> data) {
mData = data;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.mTextView.setText(mData.get(position));
}

@Override
public int getItemCount() {
return mData.size();
}

static class MyViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;

public MyViewHolder(@NonNull View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text);
}
}
}

Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
private List<String> mData;

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

mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mData = new ArrayList<>();
for (int i = 0; i < 100; i++) {
mData.add("Item " + i);
}
mAdapter = new MyAdapter(mData);
mRecyclerView.setAdapter(mAdapter);
}
}

item.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp">

<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textSize="24sp" />

</androidx.cardview.widget.CardView>

activity_main.xml

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />

创建带Header的RecyclerView

要创建一个带有Header的 RecyclerView,你需要使用 RecyclerView.Adapter 的不同 ViewType 来区分 Header 和普通列表项。以下是一个示例代码,展示如何创建一个带有 Header 的 RecyclerView:

  1. 在布局文件(例如 activity_main.xml)中添加 RecyclerView:
1
2
3
4
5
6
7
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:scrollbars="vertical"
/>
  1. 创建一个 RecyclerView 的布局文件(例如 item_list.xml)用于定义列表项的外观:
1
2
3
4
5
6
7
8
9
<!-- item_list.xml -->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="8dp"
/>
  1. 创建一个 Header 的布局文件(例如 item_header.xml)用于定义 Header 的外观:
1
2
3
4
5
6
7
8
9
10
11
<!-- item_header.xml -->
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/headerTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:padding="16dp"
android:background="@color/colorAccent" <!-- 自定义背景颜色 -->
android:textColor="@android:color/white" <!-- 自定义文字颜色 -->
/>
  1. 创建一个数据类(例如 ListItem.java)来表示 RecyclerView 中的每个项目:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ListItem {
private String text;
private boolean isHeader;

public ListItem(String text, boolean isHeader) {
this.text = text;
this.isHeader = isHeader;
}

public String getText() {
return text;
}

public boolean isHeader() {
return isHeader;
}
}
  1. 创建一个适配器类(例如 MyAdapter.java)来管理 RecyclerView 中的数据和视图:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int VIEW_TYPE_HEADER = 0;
private static final int VIEW_TYPE_ITEM = 1;

private List<ListItem> itemList;

public MyAdapter(List<ListItem> itemList) {
this.itemList = itemList;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == VIEW_TYPE_HEADER) {
View headerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_header, parent, false);
return new HeaderViewHolder(headerView);
} else {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
return new ItemViewHolder(itemView);
}
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
ListItem item = itemList.get(position);

if (holder.getItemViewType() == VIEW_TYPE_HEADER) {
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
headerViewHolder.headerTextView.setText(item.getText());
} else {
ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
itemViewHolder.textView.setText(item.getText());
}
}

@Override
public int getItemCount() {
return itemList.size();
}

@Override
public int getItemViewType(int position) {
if (itemList.get(position).isHeader()) {
return VIEW_TYPE_HEADER;
} else {
return VIEW_TYPE_ITEM;
}
}

// ViewHolder for Header
private static class HeaderViewHolder extends RecyclerView.ViewHolder {
TextView headerTextView;

HeaderViewHolder(View itemView) {
super(itemView);
headerTextView = itemView.findViewById(R.id.headerTextView);
}
}

// ViewHolder for Item
private static class ItemViewHolder extends RecyclerView.ViewHolder {
TextView textView;

ItemViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
  1. 在 Activity 中初始化 RecyclerView 并设置适配器:
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
39
40
41
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter adapter;
private List<ListItem> itemList;

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

recyclerView = findViewById(R.id.recyclerView);
itemList = new ArrayList<>();

// 添加Header项
itemList.add(new ListItem("Header 1", true));

// 添加示例数据项
itemList.add(new ListItem("Item 1", false));
itemList.add(new ListItem("Item 2

", false));

// 添加另一个Header项
itemList.add(new ListItem("Header 2", true));

// 添加更多示例数据项
itemList.add(new ListItem("Item 3", false));
itemList.add(new ListItem("Item 4", false));

adapter = new MyAdapter(itemList);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}

这个示例创建了一个带有 Header 的 RecyclerView,Header 项具有不同的外观,并与普通列表项一起显示。你可以根据需要自定义 Header 和列表项的外观以适应你的应用程序需求。

如何写RecyclerView里item中的控件的点击事件

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
39
40
41
42
43
44
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private List<String> dataList; // 假设你的数据列表是字符串的列表

public MyAdapter(List<String> dataList) {
this.dataList = dataList;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String itemText = dataList.get(position);
holder.button.setText(itemText);

// 为按钮添加点击事件
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 在这里处理按钮的点击事件
// 可以使用 position 获取列表项的位置
}
});
}

@Override
public int getItemCount() {
return dataList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
Button button;

public ViewHolder(@NonNull View itemView) {
super(itemView);
button = itemView.findViewById(R.id.button); // 这里假设按钮的 id 是 "button"
}
}
}

参考