在 Android 中使用 RecyclerView






4.11/5 (2投票s)
如何在 Android 中使用 RecyclerView。
引言
在您的 Android 应用程序中,当您想显示数据列表时,可以使用 RecyclerView
。早期 Android 提供了 ListView
用于完成相同的事情。RecyclerView
可以被认为是一个更高级、性能更优化的 ListView
版本。顾名思义,RecyclerView
也通过使用 ViewHolder
模式来回收 item。除此之外,它还使用 LayoutManager
,这使得创建水平、垂直甚至瀑布流列表更加灵活。它还提供垂直和水平滚动以及 item 动画。虽然 ListView
也可以修改为使用“ViewHolder
”模式,但 RecyclerView
强制使用它。它甚至可以处理大量数据,同时提供响应式界面。
在这篇文章中,我们将使用 Android Studio 在 Android 应用程序中实现一个简单的 RecyclerView
。我将使用 Android Studio 版本来完成此操作。
创建新项目
- 打开 Android Studio。转到 **文件 -> “新建项目”**,填写应用程序名称和其他详细信息,将 API 版本选择为 **API 15**。选择“空活动”,在下一个屏幕上保留默认选项,然后点击完成。新项目将与所需文件一起创建。(在示例中,我将应用程序名称设置为“
SimpleRecyclerViewExample
”,包设置为“com.example
” - 要使用
RecyclerView
,我们需要添加 recyclerview 依赖项。打开 _build.gradle(Module:app)_ 文件,并在 dependencies 部分添加以下“implementation ‘com.android.support:recyclerview-v7:26.1.0
’” 。点击“立即同步”以同步更改并构建项目。 - 在布局文件夹中打开 _activity_main.xml_ 并添加 Recycler View 小部件。更改后的 XML 文件应如下所示:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.simplerecyclerviewexample.MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rvFootballTeamInfo"
android:scrollbars="vertical"
></android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
对于 Recycler
视图,我们提供了一个 ID 并指定了垂直滚动条。
创建模型类和布局文件
- 我们将在
Recycler
视图中显示与足球队相关的信息。我们将创建一个模型类来存储信息。创建一个名为 _FootballTeam.java_ 的类,并为Name
、League
和YearEstablished
创建变量。package com.example.simplerecyclerviewexample; public class FootballTeam { private String name; private String league; private int yearEstablished; public FootballTeam() { } public FootballTeam(String name, String league, int yearEstablished) { this.name = name; this.league = league; this.yearEstablished = yearEstablished; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLeague() { return league; } public void setLeague(String league) { this.league = league; } public int getYearEstablished() { return yearEstablished; } public void setYearEstablished(int yearEstablished) { this.yearEstablished = yearEstablished; } }
- 创建一个名为 _row.xml_ 的布局文件。此布局将用于显示 recyclerview 中的每个记录。我们将创建一个简单的
RelativeLayout
,其中包含三个用于显示名称、联赛和成立年份的文本视图。布局的完整 XML 如下所示:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="16dp" > <TextView android:id="@+id/tvName" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" tools:text="Team Name" android:textSize="20dp" android:textStyle="bold" /> <TextView android:id="@+id/tvLeague" android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="Team League" android:layout_below="@id/tvName" /> <TextView android:id="@+id/tvYear" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="1999" android:layout_alignParentRight="true" /> </RelativeLayout>
在此示例中,我直接在 XML 中硬编码了 padding 和 textSize
,但最好将它们放在单独的 XML 文件中。我使用了“tools:Text
”属性来查看我的布局在设计器中的外观。这在应用程序运行时不会被渲染。
创建 Adapter
既然我们已经创建了 Model
和 item 布局,现在是时候创建我们的 adapter
类了。adapter
类负责创建 ViewHolder
对象以及将数据绑定到它们。
- 创建一个名为 _MyAdapter.java_ 的类,并将以下代码放入其中:
package com.example.simplerecyclerviewexample; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { public List<FootballTeam> teamList; public MyAdapter(List<FootballTeam> footballTeamList) { teamList = footballTeamList; } public class ViewHolder extends RecyclerView.ViewHolder { TextView name, league, yearEstablished; public ViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.tvName); league = (TextView) itemView.findViewById(R.id.tvLeague); yearEstablished = (TextView) itemView.findViewById(R.id.tvYear); } } public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { holder.name.setText(teamList.get(position).getName()); holder.league.setText(teamList.get(position).getLeague()); holder.yearEstablished.setText(String.valueOf (teamList.get(position).getYearEstablished())); } @Override public int getItemCount() { return teamList.size(); } }
我们的 Adapter
类扩展了 RecyclerView.Adapter
类,并管理所有 ViewHolder
对象。我们在 adapter 中定义了 ViewHolder
类,并在 ViewHolder
构造函数中初始化了 TextView
s。
adapter 负责按需创建 ViewHolder
对象。当用户滚动列表项时,它还会创建新的 viewHolder
对象。我们需要覆盖三个重要方法。
“onCreateViewHolder()
”方法用于创建 ViewHolder
,我们在其中填充我们之前创建的布局。
“onBindViewHolder()
”方法用于将数据绑定到 ViewHolder
。它根据列表位置确定需要显示的数据,并将数据填充到 ViewHolder
中。
“getItemCount()
”方法返回 dataset
的大小。在我们的例子中,这将是 teamList
中的 item 数量。
我们还创建了一个构造函数,通过该构造函数我们将分配 teamList
集合,该集合将通过我们的 Mainactivity
传递。既然我们已经创建了 adapter,现在是时候将所有内容绑定在一起了。
MainActivity 的更改
- 打开 _MainActivity.java_ 并进行如下所示的更改:
package com.example.simplerecyclerviewexample; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { RecyclerView rvTeams; List<FootballTeam> teamList = new ArrayList<>(); MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rvTeams = (RecyclerView) findViewById(R.id.rvFootballTeamInfo); setTeamData(); adapter = new MyAdapter(teamList); RecyclerView.LayoutManager manager = new LinearLayoutManager(getApplicationContext()); rvTeams.setLayoutManager(manager); rvTeams.setAdapter(adapter); } private void setTeamData() { FootballTeam team = new FootballTeam("Manchester United", "English Premier League", 1878); teamList.add(team); team = new FootballTeam("Arsenal", "English Premier League", 1886); teamList.add(team); team = new FootballTeam("Liverpool", "English Premier League", 1892); teamList.add(team); team = new FootballTeam("Juventus", "Serie A", 1897); teamList.add(team); team = new FootballTeam("Real Madrid", "La Liga", 1902); teamList.add(team); team = new FootballTeam("Bayern Munich", "Bundesliga", 1900); teamList.add(team); team = new FootballTeam("PSG", "France Ligue 1", 1970); teamList.add(team); team = new FootballTeam("Ajax", "Eredivisie", 1900); teamList.add(team); } }
在 _MainActivity.java_ 文件中,我们创建了一个指向 recyclerview 的引用,还创建了 Adapter 和列表的变量。我们使用 setTeamData()
方法将我们的 ArrayList
填充我们将要在 RecyclerView
中显示的数据。
在“onCreate()
”方法中,我们正在创建一个 LinearLayoutManager
并将其分配给我们的 RecyclerView
。LayoutManager
由 recyclerview 使用来在屏幕上定位每个单独的 item。我们使用 LinearLayoutManager
来水平定位 item。其他选项包括 GridLayoutManager
和 StaggeredGridLayoutManager
。如果需要,我们还可以创建自定义布局管理器。
设置布局管理器后,我们将自定义 adapter 分配给 recyclerview。运行应用程序后,您将看到列表中的 item 显示,如下图所示。您还可以滚动列表。RecyclerView
还提供了指定动画的各种选项,或者您可以实现一个 onclick
监听器,以便列表中的 item 可以被点击,并且您可以在 item 点击时执行某些操作。