我记得当我第一次阅读RecyclerViews 时 - 我同意一开始可能会有些混乱。希望这个解释能帮助您更好地理解它。
RecyclerView 基础知识
1。添加RecyclerView
首先您需要将RecyclerView 添加到您的XML 布局中。我假设你知道如何做到这一点。您还可以在 Java 代码中声明它:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
2。创建Adapter 并理解ViewHolder
接下来,您需要为其创建一个Adapter。这是一个实现RecyclerView.Adapter<YourAdapter.YourViewHolder> 的类。我会在一分钟内解释这意味着什么。
我相信查看Adapter 的示例有助于了解它的工作原理(例如,one I created 用于开源应用程序)。我还强烈建议查看我在 GitHub 上的 Gist 上作为示例制作的一组 Java 文件:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
我将在本说明中引用上述链接中的示例文件,以便您继续阅读。
您可以看到Adapter 类包含一个内部类,即您的ViewHolder。因此需要扩展RecyclerView.ViewHolder。
在此ViewHolder 中,您声明将用于RecyclerView 中每个列表项的布局变量。在ViewHolder 的构造函数中,分配这些变量。我指的是这部分代码(我在下面给出我的例子):
ExampleViewHolder(View itemView) {
super(itemView);
text1 = (TextView) itemView.findViewById(R.id.text1);
text2 = (TextView) itemView.findViewById(R.id.text2);
}
这就是您的ViewHolder(Adapter 中的内部类)所需要的全部内容。
3。了解Adapter
与大多数 Java 对象一样,您需要在 Adapter 类中包含一些私有变量的构造函数。这是我的:
private ArrayList<CustomClass> mCustomObjects;
public ExampleAdapter(ArrayList<CustomClass> arrayList) {
mCustomObjects = arrayList;
}
您需要将您的ArrayList<CustomClass> 作为构造函数参数,以便您可以传递列表,以便您的Adapter 可以使用它。
如果您查看Adapter 类的其余部分,它包含一些方法,这些方法覆盖了它所扩展的方法。让我们快速看一下它们是什么:
-
getItemCount() 返回列表的大小。
-
onCreateViewHolder(...) 用于扩展列表项的布局。
-
onBindViewHolder(...) 为列表项配置布局(例如,将文本设置为 TextView)
在大多数情况下,getItemCount() 只会返回您的ArrayList<CustomClass> 的size()。
onCreateViewHolder(...) 方法通常也保持不变:
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false);
return new ExampleViewHolder(view);
}
您可以看到我正在夸大将用作列表项的布局 (android.R.layout.simple_list_item_2)。此布局内置于 Android,因此我不需要创建它 - 当然,您可以使用任何您想要的布局,然后修改您的 Adapter 以获取您可能正在使用的小部件。此方法的返回类型将匹配您命名为 ViewHolder 内部类的任何内容。
现在,有趣的是onBindViewHolder(...)。您可以在此处配置布局,因此完全取决于您想要做什么。这是您可以使用的模板:
@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
CustomClass object = mCustomObjects.get(position);
String firstText = object.getFirstText()
String secondText = object.getSecondText()
holder.text1.setText(firstText);
holder.text2.setText(secondText);
}
基本上,您可以通过holder.myWidget 访问您的ViewHolder 变量(用于列表项布局中的小部件)。 holder 部分来自参数,也就是我们之前谈到的 ViewHolder,myWidget 将是 View 变量的名称。
在上面的例子中,object 有一个getFirstText() 方法,ViewHolder 包含一个TextView (text1),所以我正在设置文本。
还有另外一种方法 - onAttachedToRecyclerView(...)。您可以将其用于更复杂的事情,但在基本层面上,通常是这样的:
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
4。配置RecyclerView
记得一开始,当我们声明并分配我们的RecyclerView?:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
现在我们要对其进行配置。
您首先要设置一个“布局管理器”。这决定了每个列表项在屏幕上的显示方式。常见的是LinearLayoutManager 和GridLayoutManager。前者将您的列表项放入标准列表中(其实没什么特别的,但非常有用),后者将您的列表项组织成网格类型的布局。
在我们的示例中,我们将使用LinearLayoutManager。要在RecyclerView 上设置它,我们这样做:
recyclerView.setLayoutManager(new LinearLayoutManager(this));
就是这样。
接下来我们要做的就是将我们之前创建和自定义的Adapter 类设置为您的RecyclerView:
ExampleAdapter adapter = new ExampleAdapter(yourCustomArrayList);
recyclerView.setAdapter(adapter);
在上面,我假设您的adapter 只有一个参数,但这取决于您之前的配置方式。
5。使用您的RecyclerView
上面的步骤应该给你一个工作RecyclerView。如果你卡住了,你可以看看我是如何在我的应用程序中添加一个here。
您也可以浏览Google samples for the RecyclerView implementation。
我希望所有这些都能让您清楚地了解RecyclerView 的工作原理。
添加点击监听
您可能想要添加一个点击监听器,这样您就不会使用 RecyclerView 来显示项目。
为此,您的内部ViewHolder 类需要实现View.OnClickListener。这是因为您将为ViewHolder 的构造函数的itemView 参数设置OnClickListener。让我告诉你我的意思:
public class ExampleClickViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView text1, text2;
ExampleClickViewHolder(View itemView) {
super(itemView);
// we do this because we want to check when an item has been clicked:
itemView.setOnClickListener(this);
// now, like before, we assign our View variables
title = (TextView) itemView.findViewById(R.id.text1);
subtitle = (TextView) itemView.findViewById(R.id.text2);
}
@Override
public void onClick(View v) {
// The user may not set a click listener for list items, in which case our listener
// will be null, so we need to check for this
if (mOnEntryClickListener != null) {
mOnEntryClickListener.onEntryClick(v, getLayoutPosition());
}
}
}
您需要添加的唯一其他内容是您的Adapter 的自定义接口和一个setter 方法:
private OnEntryClickListener mOnEntryClickListener;
public interface OnEntryClickListener {
void onEntryClick(View view, int position);
}
public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
mOnEntryClickListener = onEntryClickListener;
}
因此,您的新的支持点击的Adapter 已完成。
现在,让我们使用它...
ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
@Override
public void onEntryClick(View view, int position) {
// stuff that will happen when a list item is clicked
}
});
recyclerView.setAdapter(clickAdapter);
这基本上是您设置普通Adapter 的方式,除了您使用您创建的setter 方法来控制当您的用户单击特定列表项时您将执行的操作。
重申一下,您可以查看我在 GitHub 上的 Gist 上制作的一组示例:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07