Diario de desarrollo de Android - RecycleView

Implementación de lista simple

Las listas son definitivamente el estilo más común en el desarrollo de aplicaciones. Aquí hay un registro de cómo Android usa RecyclerView para crear listas dinámicas.

Analogy RecyclerView es equivalente a UITableView y UICollectionView en iOS

RecyclerView

RecyclerView le permite mostrar grandes cantidades de datos de manera fácil y eficiente. Usted proporciona los datos y define la apariencia de cada elemento de la lista, y la biblioteca RecyclerView crea elementos dinámicamente según sea necesario.

Como sugiere el nombre, RecyclerView recicla estos elementos individuales. RecyclerView no destruye su vista cuando el elemento de la lista se desplaza fuera de la pantalla. En su lugar, RecyclerView reutiliza la vista para los nuevos elementos de la lista que se desplazan por la pantalla. Esta reutilización puede mejorar significativamente el rendimiento, mejorar la capacidad de respuesta de las aplicaciones y reducir el consumo de energía.

RecyclerView es generalmente un contenedor para elementos de lista y luego reutiliza View para guardar contenido y mejorar el rendimiento.

Para mostrar contenido, RecyclerView necesita establecer dos propiedades clave layoutManageryadapter

// 获取 recyclerView
recyclerView = findViewById(R.id.content_recycleview)
// 设置布局方式
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, true)
// 绑定 adapter
recyclerView.adapter = textAdapeter
复制代码

Administrador de diseño

  • LinearLayoutManager Diseño lineal, admite deslizamiento horizontal y vertical, y también puede voltear el diseño. Flip es realmente adecuado para salas de chat, porque la última línea del diseño invertido se muestra en la parte inferior de la pantalla. ¡Esto está fuera del alcance de iOS!
  • Disposición de cuadrícula bidimensional de GridLayoutManager, esto es muy similar a la disposición de UICollectionView de iOS, no hay nada que decir.
  • StaggeredGridLayoutManager es similar al anterior, pero la altura de los elementos en la misma columna puede ser diferente.No sé si esto se puede usar como flujo de cascada.

RecycleView示例图.png

Mac Android Studio conectar emulador mumu

RecyclerView.Adapter como RecyclerView.ViewHolder

El adaptador es la fuente de datos de UITableView en términos de iOS.

ViewHolder contiene itemView, que es equivalente a envolver una capa de Cell

public abstract static class Adapter<VH extends ViewHolder> {
    ...
}

public abstract static class ViewHolder {
    @NonNull
    public final View itemView;
    ...
    public ViewHolder(@NonNull View itemView) {
        if (itemView == null) {
            throw new IllegalArgumentException("itemView may not be null");
        }
        this.itemView = itemView;
    }
    ...
}
复制代码
  • 一个 RecyclerView 同时只对应一个 Adapter
  • 自定义的 Adapter 继承的时候需要指定一个 ViewHolder
  • ViewHolder 初始化需要传入 itemView

在看一下继承 Adapter 需要实现的方法

import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView

// 定义MyAdapter
class MyAdapter: RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    // 定义 ViewHolder
    class MyViewHolder(view: View): RecyclerView.ViewHolder(view) {

    }

    // 需要在这里对ViewHolder实例化
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        // 先实例化一个 itemView
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.cell_text, parent, false)
        // 在实例化 ViewHolder
        return MyViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // 这里就是可以根据 holder 获取 itemView
        holder.itemView
        // 然后就可以嘿嘿嘿,不用说了吧
    }

    override fun getItemCount(): Int {
        // 返回显示的个数,这个不用说了吧
    }
}
复制代码

然后给 recyclerView 设置下布局,绑定下adapter OK了。

// 设置布局方式
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, true)

// 绑定 adapter
recyclerView.adapter = MyAdapeter()
复制代码

实现多种样式

实际应用中,列表中显示的内容不可能永远都是一种样式,那么多样式是怎么实现的那这里记录一下

方法1

根据 viewType 在 onCreateViewHolder 中返回不同的 View, 复用规则是根据 viewType 的值来的(盲猜一下应该是这样)

abstract class MyViewHolder(view: View): RecyclerView.ViewHolder(view) {
    ...
}

class MyTextViewHolder(view: View): MyViewHolder(view) {
    ...
}

class MyImageViewHolder(view: View): MyViewHolder(view) {
    ...
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    val itemView = ...
    val itemView2 = ...
    // plan 1
    if (viewType == 1) {
        return MyTextViewHolder(itemView)
    } else {
        return MyImageViewHolder(itemView2)
    }
    // plan 2
    if (viewType == 1) {
        return MyTextViewHolder(itemView)
    } else {
        return MyTextViewHolder(itemView2)
    }
    
}
override fun getItemViewType(position: Int): Int {
    if (position < 10) 
        return 1
    return 2
}
复制代码

方法2 ConcatAdapter

implementation 'androidx.recyclerview:recyclerview:1.2.1'
复制代码

ConcatAdapter 像iOS里面的 Section 概念

ConcatAdapter 可以将多个不同的 Adapter 当作一个个单独的 Section 处理

// 初始化adapter
val textAdapeter = MyAdapter()
val imageAdapter = MyAdapter2()

// 绑定 adapter
val dAdapter = ConcatAdapter(textAdapeter, imageAdapter)
recyclerView.adapter = dAdapter
复制代码

screenshot_20220417_162949.png

Supongo que te gusta

Origin juejin.im/post/7087488184744935432
Recomendado
Clasificación