如何在 RecyclerView 中显示 ArrayList? [复制]
Posted
技术标签:
【中文标题】如何在 RecyclerView 中显示 ArrayList? [复制]【英文标题】:How to display an ArrayList in a RecyclerView? [duplicate] 【发布时间】:2016-10-13 16:44:27 【问题描述】:我需要添加一个Activity
,我可以在其中列出ArrayList<CustomClass>
的元素,并且我发现有一种更新更好的方式来显示列表-RecyclerView
。
我的问题是如何在我的应用中实现这一点。
我发现我需要使用Adapter
,但我不太明白如何正确实现整个过程。
如果您想知道,我指的是 this 我一直在阅读的文档示例。
编辑:
更新我的代码后,它说它无法解析符号setOnEntryClickListener
:
public class voting extends Activity
RecyclerView myList;
private ArrayList<Player> players; // Players
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_voting);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
players = (ArrayList<Player>)bundle.getSerializable("PLAYERS");
myList = (RecyclerView) findViewById(R.id.charactersList);
myList.setLayoutManager(new LinearLayoutManager(this));
CoursesAdapter adapter = new CoursesAdapter(players);
myList.setAdapter(adapter);
// OR RecyclerView with a click listener
CoursesAdapter clickAdapter = new CoursesAdapter(players);
clickAdapter.setOnEntryClickListener(new CoursesAdapter.OnEntryClickListener()
@Override
public void onEntryClick(View view, int position)
// stuff that will happen when a list item is clicked
);
recyclerView.setAdapter(clickAdapter);
所以我以为我把 interface
放在了错误的地方(很可能),事实上我把它放在了 Adapter 类的末尾,就在 onAttachedToRecyclerView()
方法之后:
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
super.onAttachedToRecyclerView(recyclerView);
private OnEntryClickListener mOnEntryClickListener;
public interface OnEntryClickListener
void onEntryClick(View view, int position);
public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener)
mOnEntryClickListener = onEntryClickListener;
【问题讨论】:
这里有一个完整的示例github.com/googlesamples/android-RecyclerView。 【参考方案1】:我记得当我第一次阅读RecyclerView
s 时 - 我同意一开始可能会有些混乱。希望这个解释能帮助您更好地理解它。
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
【讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 我们如何使用数据绑定在 xml 文件中为 arraylist 中的任何对象重复 EditText 并指定要在其中显示的特定数据字段?【参考方案2】:这是一个工作示例,希望对您有所帮助:
public class BankListAdapter extends RecyclerView.Adapter<BankListAdapter.BankListViewHolder>
ArrayList<BankListModel> bankListModels;
FragmentActivity activity;
View selectBank;
public BankListAdapter(ArrayList<BankListModel> bankListModels, FragmentActivity activity)
this.bankListModels=bankListModels;
this.activity=activity;
@Override
public BankListViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View bankListLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_bank_list, null);
BankListViewHolder bankListViewHolder = new BankListViewHolder(bankListLayout);
return bankListViewHolder;
@Override
public void onBindViewHolder(BankListViewHolder holder, int position)
holder.bankName.setText(bankListModels.get(position).getBankName());
@Override
public int getItemCount()
return bankListModels.size();
public class BankListViewHolder extends RecyclerView.ViewHolder
TextView bankName;
public BankListViewHolder(View itemView)
super(itemView);
bankName = (TextView) itemView.findViewById(R.id.tv_bankName);
selectBank = itemView.findViewById(R.id.cv_selectBank);
【讨论】:
以上是关于如何在 RecyclerView 中显示 ArrayList? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在android的Recyclerview中显示更多[重复]
如何在 RecyclerView 中显示 ArrayList? [复制]
如何在 Kotlin 中显示来自 RecyclerView 的全屏图像?
如何知道何时显示布局中的特定视图在RecyclerView中