FET*_*FET 10 java android arraylist android-adapter android-recyclerview
我需要添加一个Activity我可以列出的元素,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);
}
Run Code Online (Sandbox Code Playgroud)
所以我认为我把它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;
}
}
Run Code Online (Sandbox Code Playgroud)
Far*_*deh 26
我记得当我第一次读到RecyclerViews时 - 我同意它起初可能有点令人困惑.希望这个解释能帮助您更好地理解它.
RecyclerView首先,您需要将您RecyclerView的XML布局添加到XML布局中.我假设你知道怎么做.您还在Java代码中声明它:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的(你ViewHolder内在的课程Adapter).
Adapter与大多数Java对象一样,您需要在Adapter类中使用构造函数一些私有变量.这是我的:
private ArrayList<CustomClass> mCustomObjects;
public ExampleAdapter(ArrayList<CustomClass> arrayList) {
mCustomObjects = arrayList;
}
Run Code Online (Sandbox Code Playgroud)
您需要将您的ArrayList<CustomClass>作为构造函数参数,以便您可以传递列表,以便您Adapter可以使用它.
如果你看一下这个Adapter类的其余部分,它包含了一些方法,它覆盖了它扩展的内容.让我们快速浏览一下这些是什么:
getItemCount() 返回列表的大小.onCreateViewHolder(...) 用于为列表项膨胀布局.onBindViewHolder(...)配置列表项的布局(例如,将文本设置为a 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);
}
Run Code Online (Sandbox Code Playgroud)
你可以看到我正在膨胀我将用作列表项(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);
}
Run Code Online (Sandbox Code Playgroud)
基本上,您可以ViewHolder通过执行操作来访问变量(对于列表项布局中的小部件)holder.myWidget.该holder部分来自参数,这是ViewHolder我们之前谈到的,并且myWidget将是View变量的名称.
在上面的例子中,object有一个getFirstText()方法,并ViewHolder包含一个TextView(text1),所以我正在设置文本.
还有一种方法 - onAttachedToRecyclerView(...).您可以将它用于更复杂的事情,但在基本层面上,通常是这样的:
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
Run Code Online (Sandbox Code Playgroud)
RecyclerView记得在开始的时候,我们宣布并分配了我们的RecyclerView?:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
Run Code Online (Sandbox Code Playgroud)
现在我们要配置它.
首先设置"布局管理器".这决定了每个列表项在屏幕上的显示方式.常见的是LinearLayoutManager和GridLayoutManager.前者将您的列表项放入标准列表(没有什么特别的,但它非常有用),后者将列表项组织成网格类型的布局.
在我们的例子中,我们将使用a LinearLayoutManager.要设置它RecyclerView,我们这样做:
recyclerView.setLayoutManager(new LinearLayoutManager(this));
Run Code Online (Sandbox Code Playgroud)
就这样.
我们接下来要做的就是将Adapter我们创建的类和之前定制的类设置为RecyclerView:
ExampleAdapter adapter = new ExampleAdapter(yourCustomArrayList);
recyclerView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
在上面,我假设您adapter只有一个参数,但这取决于您之前的配置方式.
RecyclerView上面的步骤应该让你工作RecyclerView.如果您遇到问题,你可以看看我如何添加一个到我的应用程序在这里.
您还可以查看Google示例以了解RecyclerView实施情况.
我希望所有这些都能让你清楚地知道它是如何RecyclerView运作的.
您可能希望添加单击侦听器,以便不使用RecyclerViewjust来显示项目.
要做到这一点,你的内部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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要添加的唯一其他内容是您Adapter和setter方法的自定义界面:
private OnEntryClickListener mOnEntryClickListener;
public interface OnEntryClickListener {
void onEntryClick(View view, int position);
}
public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
mOnEntryClickListener = onEntryClickListener;
}
Run Code Online (Sandbox Code Playgroud)
所以你的新点击支持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);
Run Code Online (Sandbox Code Playgroud)
这基本上是你设置法线的方法Adapter,除了你使用你创建的setter方法来控制当你的用户点击特定列表项时你将做什么.
重申一下,您可以查看我在GitHub上对此Gist所做的一组示例:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
| 归档时间: |
|
| 查看次数: |
30509 次 |
| 最近记录: |