我需要添加一个Activity
可以列出an元素的位置,ArrayList<CustomClass>
并且我发现有一种更新更好的显示列表的方法-
RecyclerView
。
我的问题是如何在我的应用程序中实现这一点。我发现我需要使用Adapter
,但是我不太了解如何正确实现整个过程。
如果你想知道,我指的是这个的文档的例子,这是我一直在读。
编辑:
更新我的代码后,它说它无法解析该符号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()
Method之后:
@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;
}
}
我记得当我第一次阅读有关RecyclerView
s的内容时-我同意一开始可能会有些混乱。希望这种解释可以帮助您更好地理解它。
RecyclerView
首先,您需要将您的内容添加RecyclerView
到XML布局中。我假设您知道该怎么做。您还可以在Java代码中声明它:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
Adapter
与理解ViewHolder
接下来,您需要为其创建一个 Adapter
。这是一个实现的类RecyclerView.Adapter<YourAdapter.YourViewHolder>
。我将在一分钟内解释这意味着什么。
我认为看一个例子Adapter
来了解它是如何工作的(例如我为一个开源应用创建的例子)会有所帮助。我也强烈建议您浏览我在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
)所需要的。
Adapter
像大多数Java对象一样,您将需要在Adapter
类中构造一些私有变量。这是我的:
private ArrayList<CustomClass> mCustomObjects;
public ExampleAdapter(ArrayList<CustomClass> arrayList) {
mCustomObjects = arrayList;
}
您将需要使用ArrayList<CustomClass>
as作为构造函数参数,以便可以传递列表,以便Adapter
可以使用它。
如果您查看Adapter
该类的其余部分,则该类包含一些方法,这些方法将从其扩展内容中覆盖。让我们快速看一下这些是什么:
getItemCount()
返回列表的大小。onCreateViewHolder(...)
用于增加列表项的布局。onBindViewHolder(...)
配置列表项的布局(例如,将文本设置为TextView
)在大多数情况下,getItemCount()
只会返回size()
您的ArrayList<CustomClass>
。
该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);
}
基本上,您可以ViewHolder
通过执行来访问变量(用于列表项布局中的窗口小部件)holder.myWidget
。该holder
部分来自参数,这是ViewHolder
我们之前讨论的参数,它将是该参数myWidget
的名称View
。
在上面的示例中,object
具有一个getFirstText()
方法,并且ViewHolder
包含一个TextView
(text1
),因此我正在设置文本。
还有另一种方法- onAttachedToRecyclerView(...)
。您可以将其用于更复杂的事情,但是在基本级别上,通常是这样的:
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
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
只有一个参数,但这取决于您之前的配置方式。
RecyclerView
上面的步骤应该可以使您工作RecyclerView
。如果您遇到困难,可以在这里查看如何将其添加到我的应用程序中。
您也可以浏览Google示例以了解RecyclerView
实施情况。
我希望所有这些都能使您对RecyclerView
工作原理有一个清晰的认识。
您可能想要添加一个点击侦听器,以便您不仅仅使用RecyclerView
正义来显示项目。
为此,您的内部ViewHolder
类需要实现View.OnClickListener
。这是因为您将将设置为的构造函数OnClickListener
的itemView
参数ViewHolder
。让我告诉你我的意思:
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
我想要一个recyclerview,当第一个应用程序打开时,然后在创建时从服务器获取一些数据,当向上滚动时,会显示recyclerview下方的进度条,当向上滚动到服务器时再次点击URL,并在先前获取的数据下方获取更多数据。但我知道当我第二次点击URL时,它会刷新页面,并在第二次点击时只显示从服务器获取的数据,但我想要第一次和第二次点击的响应。 对不起,我说英语 以下是我的主要活动代码: }
我在StackOverflow上看到了一些类似的事件。然而,这些似乎都不适用于我的情况。我遇到的问题是,我的RecyclerView正在工作,但没有显示任何内容。我已经运行了多个测试,试图找出它不工作的原因,但所有测试都支持它正常工作的事实。 getItemCount中的日志返回3,这是正确的数字。我只是不明白为什么它没有显示。我回头看了我在以前的活动中做的回收器视图,它们都在一定程度上匹配(其他
问题内容: 使用 在现有数据库中显示数据的最佳方法是什么? 答案中没有包含全部解释,因此,我添加了此问与答样式,以便可以将其链接到注释中。 问题答案: 假设你具有一个如下所示的Firestore数据库结构: 看起来也像这样的模型类: 包含的文件也如下所示: 要显示所有产品名称,请按照以下步骤操作。 首先,你需要RecyclerView在你的活动中找到并进行如下设置LinearLayoutManag
我用于在布局文件中放置一个特殊视图,如文档中所述,以便在没有数据时显示。此视图的id为。
这是我现在面临的一个奇怪的问题。从我的应用程序中,我从JSON文件中从链接中获取数据,然后用Volley解析它。现在我想在一个看起来不起作用的RecyclerView上显示数据,我很高兴我的代码很好,但是有些东西似乎不起作用,我找不到它。 这是活动代码 HomeActivity.java: 这是我从适配器中扩展的布局,并从JSON文件中设置数据 和适配器类相关的代码,我猜: @Override p
使用Android在中显示现有Firestore数据库中的数据的最佳方法是什么?