如果您的应用程序需要基于大型数据集(或经常更改的数据)显示元素滚动列表,则应RecyclerView 按照本页所述使用。
提示:通过单击文件>新建>片段>片段(列表),从Android Studio中的一些模板代码开始。然后只需将片段添加到您的活动布局。
图1.使用的列表RecyclerView
图2.还在使用的列表CardView
如果您想创建一个带有卡片的列表,如图2所示,还可以按照创建基于卡片的布局中CardView所述使用该 小部件 。
如果您想查看一些示例代码RecyclerView,请查看 RecyclerView示例应用程序。
RecyclerView概述
该RecyclerView小部件是一个更高级和灵活的版本ListView。
在RecyclerView模型中,几个不同的组件一起工作来显示您的数据。用户界面的整体容器是RecyclerView添加到布局的对象。在RecyclerView与所提供的意见罢了本身 的布局管理器,你提供。您可以使用我们的标准布局管理器之一(如 LinearLayoutManager或GridLayoutManager),或者实现您自己的。
列表中的视图由视图持有者对象表示。这些对象是您通过扩展定义的类的实例RecyclerView.ViewHolder。每个视图持有者负责显示具有视图的单个项目。例如,如果您的列表显示音乐收藏,则每个查看者可能代表一个专辑。的RecyclerView创建因为需要显示动态内容的画面上的部分仅作为许多视图持有者,加上一些额外的。当用户滚动浏览列表时,RecyclerView将取消屏幕视图并将其重新绑定到滚动到屏幕上的数据。
视图持有者对象由您通过扩展创建的适配器进行管理RecyclerView.Adapter。适配器根据需要创建视图持有者。适配器还将视图持有者绑定到他们的数据。它通过将视图持有者分配给某个位置并调用适配器的onBindViewHolder()方法来完成此操作。该方法使用查看者的位置根据其列表位置确定内容应该是什么。
这个RecyclerView模型做了很多优化工作,所以你不必:
- 当列表首次填充时,它将创建并绑定列表任一侧的一些查看者。例如,如果视图显示列表位置0到9,则RecyclerView创建并绑定这些视图持有者,并且还可以创建并绑定位置10的视图持有者。这样,如果用户滚动列表,则下一个元素已准备就绪显示。
- 当用户滚动列表时,根据需要RecyclerView创建新的视图持有者。它还可以保存已经在屏幕外滚动的视图持有者,因此可以重复使用。如果用户切换他们正在滚动的方向,则从屏幕滚动出来的视图持有者可以被带回来。另一方面,如果用户保持相同方向的滚动,那么已经离开最长时间的视图持有者可以被重新绑定到新数据。视图持有人不需要创建或视图膨胀; 相反,应用程序只是更新视图的内容以匹配它绑定的新项目。
- 当显示的项目改变时,您可以通过调用适当的RecyclerView.Adapter.notify…()方法来通知适配器。适配器的内置代码然后重新绑定受影响的项目。
添加支持库
要访问该RecyclerView小部件,您需要将v7支持库添加 到您的项目中,如下所示:
打开build.gradle您的应用程序模块的文件。
将支持库添加到该dependencies部分。
dependencies {
implementation 'com.android.support:recyclerview-v7:27.1.1'
}
将RecyclerView添加到您的布局
现在你可以添加RecyclerView到你的布局文件。例如,以下布局RecyclerView 用作整个布局的唯一视图:
<?xml version="1.0" encoding="utf-8"?>
<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
RecyclerView将布局添加到布局后,获取对象的句柄,将其连接到布局管理器,然后为要显示的数据附加适配器:
public class MyActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
// ...
}
添加一个列表适配器
要将所有数据提供给列表,您必须扩展RecyclerView.Adapter该类。该对象为项目创建视图,并在原始项目不再可见时用新数据项目替换某些视图的内容。
以下代码示例显示了一个数据集的简单实现,该数据集由使用TextView小部件显示的字符串数组组成:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
TextView v = (TextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
...
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
布局管理器调用适配器的onCreateViewHolder()方法。该方法需要构造一个RecyclerView.ViewHolder 并设置它用来显示其内容的视图。ViewHolder的类型必须与Adapter类签名中声明的类型相匹配。通常,它会通过膨胀XML布局文件来设置视图。由于视图持有者尚未分配给任何特定数据,因此该方法实际上并未设置视图的内容。
布局管理器然后将视图持有者绑定到其数据。它通过调用适配器的onBindViewHolder()方法并在视图中传递视图持有者的位置来完成此操作 RecyclerView。该onBindViewHolder()方法需要获取适当的数据,并用它来填充视图持有者的布局。例如,如果RecyclerView显示名称列表,该方法可能会在列表中找到适当的名称,然后填入视图持有者的TextView小部件。
如果列表需要更新,请在RecyclerView.Adapter对象上调用通知方法,例如 notifyItemChanged()。布局经理然后重新绑定任何受影响的视图持有者,允许他们的数据被更新。
提示: 您可能会发现ListAdapter该类对于确定列表更改时需要更新列表中的哪些项目很有用。
自定义您的RecyclerView
您可以自定义RecyclerView对象以满足您的特定需求。标准类提供了大多数开发人员需要的所有功能; 在许多情况下,您需要做的唯一定制就是为每个视图持有者设计视图,并编写代码以使用适当的数据更新这些视图。但是,如果您的应用程序具有特定要求,则可以通过多种方式修改标准行为。以下各节介绍其他一些常用自定义设置。
修改布局
在RecyclerView使用布局管理的各个项目定位在屏幕上,并决定何时重用不再对用户可见的项目的看法。要重用(或回收)视图,布局管理器可能会要求适配器使用数据集中的其他元素替换视图的内容。以这种方式回收视图通过避免创建不必要的视图或执行昂贵的findViewById()查找来提高性能。Android支持库包含三个标准布局管理器,每个管理器都提供了许多自定义选项:
LinearLayoutManager将项目排列在一维列表中。使用RecyclerViewwith LinearLayoutManager提供了像旧版本的功能ListView。
GridLayoutManager将项目排列在二维网格中,如棋盘上的方格。使用RecyclerViewwith GridLayoutManager提供了像旧版本的功能GridView。
StaggeredGridLayoutManager 将项目排列在一个二维网格中,每列与之前的一列略有偏移,就像美国国旗中的星星一样。
如果这些布局管理器都不适合您的需求,则可以通过扩展RecyclerView.LayoutManager 抽象类来创建自己的布局管理器。
添加项目动画
每当一件物品发生变化时,就会RecyclerView 使用动画师改变其外观。这个动画师是一个扩展抽象RecyclerView.ItemAnimator类的对象。默认情况下, RecyclerView使用DefaultItemAnimator提供动画。如果你想提供自定义动画,你可以通过扩展来定义你自己的动画对象RecyclerView.ItemAnimator。
启用列表项选择
该 recyclerview-selection 库使用户能够RecyclerView使用触摸或鼠标输入来选择列表中的项目 。您保留对选定项目的视觉呈现的控制权。您还可以保留对控制选择行为的策略的控制,例如可以选择的项目以及可以选择的项目数量。
要将选择支持添加到RecyclerView 实例,请按照下列步骤操作:
确定要使用哪个选择键类型,然后构建一个 ItemKeyProvider。
有三种关键类型可以用来标识选定的项目:( Parcelable和所有的子类如 Uri)String,和Long。有关选择键类型的详细信息,请参阅 SelectionTracker.Builder。
执行ItemDetailsLookup。
ItemDetailsLookup 使选择库可以访问有关RecyclerView项目的 信息 MotionEvent。它实际上是由ItemDetails 实例备份(或从中提取) RecyclerView.ViewHolder实例的工厂 。
更新项目Views中 RecyclerView,以反映用户已选择或不选择它。
选择库不提供所选项目的默认视觉装饰。实施时必须提供此信息 onBindViewHolder()。推荐的方法如下:
在中 onBindViewHolder(),用setActivated() (或 取决于是否选中该项目setSelected())调用 (不)该View对象。truefalse
更新视图的样式以表示激活的状态。我们建议您使用 颜色状态列表资源 来配置样式。
用于ActionMode向用户提供工具以对选择执行操作。
注册一个SelectionTracker.SelectionObserver 选择更改时通知。首次创建选择时,开始ActionMode向用户表示此选择,并提供特定于选择的操作。例如,您可以向该ActionMode栏添加删除按钮,并连接栏上的后退箭头以清除选择。当选择变为空时(如果用户上次清除选择),不要忘记终止操作模式。
执行任何解释的辅助操作
在事件处理流水线结束时,库可以确定用户正在试图通过点击它来激活项目,或者试图拖放一个或一组选定的项目。通过注册适当的监听程序来响应这些解释。有关更多信息,请参阅 SelectionTracker.Builder。
装配一切 SelectionTracker.Builder
以下示例显示如何使用Long选择键将这些部分放在一起 :
SelectionTracker tracker = new SelectionTracker.Builder<>(
"my-selection-id",
recyclerView,
new StableIdKeyProvider(recyclerView),
new MyDetailsLookup(recyclerView),
StorageStrategy.createLongStorage())
.withOnItemActivatedListener(myItemActivatedListener)
.build();
为了构建一个 SelectionTracker 实例,您的应用程序必须提供相同的 RecyclerView.Adapter,你用来初始化RecyclerView 到 SelectionTracker.Builder。出于这个原因,您很可能需要在SelectionTracker 创建RecyclerView.Adapter后将实例注入到 创建 之后 RecyclerView.Adapter 。否则,您将无法从onBindViewHolder() 方法中检查项目的选定状态 。
将选择包括在活动生命周期 事件中。
为了跨越保存选择状态 的活动生命周期 事件,您的应用程序必须调用选择跟踪的 onSaveInstanceState() 和 onRestoreInstanceState() 方法,从活动的 onSaveInstanceState()和 onRestoreInstanceState() 分别的方法。您的应用程序还必须为SelectionTracker.Builder 构造函数提供唯一的选择标识 。此ID是必需的,因为活动或片段可能有多个不同的可选列表,所有这些列表都需要保存在其保存的状态中。
联系我
QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ
公众号推荐:
转载于:https://blog.51cto.com/4789781/2132350