首页 > 编程知识 正文

android 动态添加view,android view绘制流程

时间:2023-05-04 04:56:57 阅读:135413 作者:1134

使用RecyclerView创建动态列表

使用RecyclerView可以轻松高效地查看大量数据。 提供数据并定义每个列表项的外观。 RecyclerView库根据需要动态创建元素。

坦率的汉堡,RecyclerView回收这些单个的要素。 当列表项目从屏幕滚动时,RecyclerView不会丢弃视图。 相反,RecyclerView会为屏幕上滚动的新列表项目重用视图。 这种重用方式大大提高了性能,提高了APP响应速度,降低了能耗。

注意: RecyclerView不仅是类的名称,也是库的名称。 在此页面上,使用code font字体的RecyclerView始终表示RecyclerView库中的类。

密钥类

可以通过组合多个不同的类来构建动态列表。

查看组。 因为它本身就是视图,所以将RecyclerView添加到布局的方式与添加其他界面元素的方式相同。

列表中的每个独立元素由ViewHolder对象定义。 创建ViewHolder时,没有相关数据。 创建ViewHolder时,RecyclerView将绑定到其数据。 要定义ViewHolder,请展开RecyclerView.ViewHolder。

RecyclerView请求这些视图,并通过在Adapter中调用方法将视图绑定到数据。 要定义适配器,请展开RecyclerView.Adapter。

布局管理器负责放置列表中的每个元素。 您可以使用RecyclerView库中提供的布局管理器,也可以定义自己的布局管理器。 布局管理器都是基于库的LayoutManager抽象类。

要实现RecyclerView

如果使用RecyclerView,则需要完成几个任务。 下一节将详细介绍这些工作。

首先,确定列表或网格的外观。 通常,您将使用RecyclerView库的标准布局管理器。

设计列表中每个元素的外观和行为。 基于此设计,扩展ViewHolder类。 ViewHolder版本提供列表项目的所有功能。 您的ViewHolder是View的封装容器,此视图由RecyclerView管理。

定义用于将数据与ViewHolder视图关联的适配器。

您还可以使用高级定制选项定制RecyclerView以满足您的需要。

规划布局

RecyclerView中的列表项由LayoutManager类放置。 RecyclerView库提供了三个布局管理器来处理最常见的布局情况。

GridLayoutManager将所有项目置于二维网格中。

如果网格垂直对齐,则网格管理器会使每行中所有元素的宽度和高度尽可能相同,但可以根据行的不同而不同。

如果网格水平对齐,则GridLayoutManager会使每列中所有元素的宽度和高度尽可能相同,但可以根据列的不同而不同。

StaggeredGridLayoutManager与GridLayoutManager类似,但同一行中的列表项必须具有相同的高度(纵向网格需要),或者同一列中的列表项必须具有相同的宽度(横向网格需要) 结果,同一行或列的列表项目可能会意外掉落。

还需要设计每个列表项的布局。 设计ViewHolder时,必须使用此布局,如以下部分所述。

实现适配器和视图保持器

确定布局后,需要实现适配器和ViewHolder。 将这两个类组合起来,定义数据的显示方式。 ViewHolder是View的封装容器,包含列表中每个列表项的布局。 Adapter根据需要创建ViewHolder对象并设置这些视图的数据。 将视图与其数据相关联的过程称为“绑定”。

定义适配器时,必须替换以下三种重要方法:

每次RecyclerView需要创建新的ViewHolder时,都会调用onCreateViewHolder (:)此方法。 此方法创建并初始化ViewHolder及其关联的View,但不填充视图内容。 这是因为ViewHolder当前未绑定到特定数据。

onbindViewHolder(:recyclerview调用此方法将数据与viewholder相关联。 此方法提取适当的数据,并将该数据输入到ViewHolder布局中。 例如,如果RecyclerView显示名称列表,则方法可以在列表中查找相应的名称,并将其输入到ViewHolder的TextView小部件中。

getitemcount(:recyclerview调用此方法以获取数据集的大小。 例如,在通讯簿APP应用程序中,这可能是地址的总数。 RecyclerView使用此方法来确定何时没有更多可显示的列表项目。

接下来是典型的简

单 Adapter 示例,该 Adapter 包含一个显示数据列表的嵌套 ViewHolder。在本例中,RecyclerView 显示了一个简单的文本元素列表。系统会向 Adapter 传递一个字符串数组,该数组包含了 ViewHolder 元素的文本。

Kotlin

class CustomAdapter(private val dataSet: Array) :

RecyclerView.Adapter() {

/**

* Provide a reference to the type of views that you are using

* (custom ViewHolder).

*/

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

val textView: TextView

init {

// Define click listener for the ViewHolder's View.

textView = view.findViewById(R.id.textView)

}

}

// Create new views (invoked by the layout manager)

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {

// Create a new view, which defines the UI of the list item

val view = LayoutInflater.from(viewGroup.context)

.inflate(R.layout.text_row_item, viewGroup, false)

return ViewHolder(view)

}

// Replace the contents of a view (invoked by the layout manager)

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {

// Get element from your dataset at this position and replace the

// contents of the view with that element

viewHolder.textView.text = dataSet[position]

}

// Return the size of your dataset (invoked by the layout manager)

override fun getItemCount() = dataSet.size

}Java

public class CustomAdapter extends RecyclerView.Adapter {

private String[] localDataSet;

/**

* Provide a reference to the type of views that you are using

* (custom ViewHolder).

*/

public static class ViewHolder extends RecyclerView.ViewHolder {

private final TextView textView;

public ViewHolder(View view) {

super(view);

// Define click listener for the ViewHolder's View

textView = (TextView) view.findViewById(R.id.textView);

}

public TextView getTextView() {

return textView;

}

}

/**

* Initialize the dataset of the Adapter.

*

* @param dataSet String[] containing the data to populate views to be used

* by RecyclerView.

*/

public CustomAdapter(String[] dataSet) {

localDataSet = dataSet;

}

// Create new views (invoked by the layout manager)

@Override

public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

// Create a new view, which defines the UI of the list item

View view = LayoutInflater.from(viewGroup.getContext())

.inflate(R.layout.text_row_item, viewGroup, false);

return new ViewHolder(view);

}

// Replace the contents of a view (invoked by the layout manager)

@Override

public void onBindViewHolder(ViewHolder viewHolder, final int position) {

// Get element from your dataset at this position and replace the

// contents of the view with that element

viewHolder.getTextView().setText(localDataSet[position]);

}

// Return the size of your dataset (invoked by the layout manager)

@Override

public int getItemCount() {

return localDataSet.length;

}

}

每个视图项的布局照例在 XML 布局文件中定义。在本例中,应用包含一个 text_row_item.xml 文件,如下所示:

android:layout_width="match_parent"

android:layout_height="@dimen/list_item_height"

android:layout_marginLeft="@dimen/margin_medium"

android:layout_marginRight="@dimen/margin_medium"

android:gravity="center_vertical">

android:id="@+id/textView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/element_text"/>

后续步骤

您可能只需要这样一个简单的 RecyclerView 实现。不过,该库还提供了许多其他方式供您对实现进行自定义。如需了解详情,请参阅高级 RecyclerView 自定义。

其他资源

如需详细了解如何在 Android 平台上进行测试,请参阅以下资源。

示例应用

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。