草庐IT

java - 如何在 RecyclerView 中显示 ArrayList?

coder 2023-11-23 原文

这个问题在这里已经有了答案:





The simplest way to display Strings with icons in a RecyclerView

(2 个回答)


5年前关闭。




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



}

最佳答案

我记得我第一次读到 RecyclerView 的时候s - 我同意一开始可能有点困惑。希望这个解释能帮助你更好地理解它。

RecyclerView 基础知识

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

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

2. 创建 Adapter与理解ViewHolder
接下来,您需要创建一个 Adapter 为了它。这是一个实现 RecyclerView.Adapter<YourAdapter.YourViewHolder> 的类.我将在一分钟内解释这意味着什么。

我相信看一个 Adapter 的例子会有所帮助。了解它是如何工作的(例如 one I created 用于开源应用程序)。我还强烈建议查看我在 GitHub 上的 Gist 上作为示例制作的一组 Java 文件:

https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07

我将在本说明中引用上述链接中的示例文件,以便您可以继续阅读。

您可以看到 Adapter class 包含一个内部类,它是您的 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)变量。类(class)。这是我的:
private ArrayList<CustomClass> mCustomObjects;

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

您需要拥有 ArrayList<CustomClass>作为构造函数参数,因此您可以传递列表,以便您的 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);
    }
    

    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 .这是因为您将设置 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

    关于java - 如何在 RecyclerView 中显示 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37786796/

    有关java - 如何在 RecyclerView 中显示 ArrayList?的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

      我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

    3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    6. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    7. ruby - 如何在续集中重新加载表模式? - 2

      鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

    8. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

      我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

    9. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

      我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

    10. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

      所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

    随机推荐