当前位置: 首页 > 面试题库 >

如何在RecyclerView中显示ArrayList?

苏丰茂
2023-03-14
问题内容

我需要添加一个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;
}



}

问题答案:

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

1.添加 RecyclerView

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

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

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);
}

这就是您ViewHolder(您的中的内部类Adapter)所需要的。

3.了解 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包含一个TextViewtext1),因此我正在设置文本。

还有另一种方法- 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。如果您遇到困难,可以在这里查看如何将其添加到我的应用程序中。

您也可以浏览Google示例以了解RecyclerView实施情况。

我希望所有这些都能使您对RecyclerView工作原理有一个清晰的认识。

添加点击监听器

您可能想要添加一个点击侦听器,以便您不仅仅使用RecyclerView正义来显示项目。

为此,您的内部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());
        }
    }
}

您需要添加的唯一其他内容是您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数据库中的数据的最佳方法是什么?