如何在 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】:

我记得当我第一次阅读RecyclerViews 时 - 我同意一开始可能会有些混乱。希望这个解释能帮助您更好地理解它。


RecyclerView 基础知识

1。添加RecyclerView

首先您需要将RecyclerView 添加到您的XML 布局中。我假设你知道如何做到这一点。您还可以在 Java 代码中声明它:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.your_recycler_view);

2。创建Adapter 并理解ViewHolder

接下来,您需要为其创建一个Adapter。这是一个实现RecyclerView.Adapter&lt;YourAdapter.YourViewHolder&gt; 的类。我会在一分钟内解释这意味着什么。

我相信查看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);

这就是您的ViewHolderAdapter 中的内部类)所需要的全部内容。

3。了解Adapter

与大多数 Java 对象一样,您需要在 Adapter 类中包含一些私有变量的构造函数。这是我的:

private ArrayList<CustomClass> mCustomObjects;

public ExampleAdapter(ArrayList<CustomClass> arrayList) 
    mCustomObjects = arrayList;

您需要将您的ArrayList&lt;CustomClass&gt; 作为构造函数参数,以便您可以传递列表,以便您的Adapter 可以使用它。

如果您查看Adapter 类的其余部分,它包含一些方法,这些方法覆盖了它所扩展的方法。让我们快速看一下它们是什么:

getItemCount() 返回列表的大小。 onCreateViewHolder(...) 用于扩展列表项的布局。 onBindViewHolder(...) 为列表项配置布局(例如,将文本设置为 TextView

在大多数情况下,getItemCount() 只会返回您的ArrayList&lt;CustomClass&gt;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 部分来自参数,也就是我们之前谈到的 ViewHoldermyWidget 将是 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);

现在我们要对其进行配置。

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

在我们的示例中,我们将使用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中

如何在 Android 的 RecyclerView 中显示来自 Firestore 的数据?

如何在 RecyclerView 中显示乘法布局 [重复]