如何在RecyclerView中显示ArrayList?

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基础知识

1.添加 RecyclerView

首先,您需要将您RecyclerView的XML布局添加到XML布局中.我假设你知道怎么做.您还在Java代码中声明它:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
Run Code Online (Sandbox Code Playgroud)

2.创造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).

3.了解 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)

4.配置 RecyclerView

记得在开始的时候,我们宣布并分配了我们的RecyclerView?:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);
Run Code Online (Sandbox Code Playgroud)

现在我们要配置它.

首先设置"布局管理器".这决定了每个列表项在屏幕上的显示方式.常见的是LinearLayoutManagerGridLayoutManager.前者将您的列表项放入标准列表(没有什么特别的,但它非常有用),后者将列表项组织成网格类型的布局.

在我们的例子中,我们将使用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只有一个参数,但这取决于您之前的配置方式.

5.使用你的 RecyclerView

上面的步骤应该让你工作RecyclerView.如果您遇到问题,你可以看看我如何添加一个到我的应用程序在这里.

您还可以查看Google示例以了解RecyclerView实施情况.

我希望所有这些都能让你清楚地知道它是如何RecyclerView运作的.


添加单击侦听器

您可能希望添加单击侦听器,以便不使用RecyclerViewjust来显示项目.

要做到这一点,你的内部ViewHolder类需要实现View.OnClickListener.这是因为你将设置一个构造函数OnClickListeneritemView参数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