Aplicación de vista de lista (ListView) en Android Studio

Tabla de contenido

introducción

1. El papel de la vista de lista

2. Principio de funcionamiento y método de funcionamiento de la vista de lista.

3. Preparar fuentes de datos

4. Uso del adaptador

5. Vista de lista en el archivo de diseño

6. Personalizar el diseño de los elementos de la lista

7. Procesamiento de eventos de clic de elemento de lista

8. Optimización de listas

10. Código de muestra y demostración.

11. Resumen y perspectivas

Referencias:


introducción

        ¡Bienvenidos a este blog! En el desarrollo de aplicaciones móviles, ListView es un componente indispensable: nos proporciona una forma concisa y poderosa de mostrar y administrar grandes cantidades de datos . Ya sea que muestren listas de contactos , información de productos o registros de mensajes , las vistas de listas nos permiten presentar datos a los usuarios de manera clara y ordenada .

        En el desarrollo de aplicaciones móviles actual, Android Studio es nuestro asistente derecho. Proporciona un amplio conjunto de herramientas y funciones de desarrollo que nos permiten crear fácilmente aplicaciones que satisfagan las expectativas de los usuarios. En Android Studio, usar vistas de lista es un requisito muy común , por lo que dominar el uso de vistas de lista es una de las habilidades esenciales para todo desarrollador.

        En este blog profundizaremos en el uso de vistas de lista en Android Studio . aprenderemos _

  • Cómo definir y configurar la vista de lista en un archivo de diseño ,
  • Cómo preparar fuentes de datos
  • Cómo asociar datos con la vista de lista usando el adaptador .
  •   También aprenderemos cómo personalizar la apariencia de los elementos de la lista según nuestras necesidades y manejar operaciones interactivas como eventos de clic en elementos de la lista .
  • Finalmente, también compartiremos algunos consejos de optimización para mejorar el rendimiento de su aplicación y la experiencia del usuario.

        Ya sea un principiante o un desarrollador experimentado, este blog le brindará un conocimiento completo y práctico. ¡Comencemos a explorar el maravilloso mundo de las vistas de listas en Android Studio!

1. El papel de la vista de lista

        La vista de lista juega un papel importante en el desarrollo de aplicaciones de Android: nos proporciona una forma intuitiva y eficiente de mostrar y administrar grandes cantidades de datos. Ya sea que muestren listas de contactos, información de productos o registros de mensajes, las vistas de lista pueden presentar datos a los usuarios de manera clara y ordenada y proporcionar una rica interactividad.

A continuación se muestran algunos casos de uso comunes para vistas de lista:

  1. Mostrar una lista de contactos: una vista de lista es ideal cuando una aplicación necesita mostrar una lista de contactos. A través de la vista de lista, podemos mostrar el nombre del contacto, el avatar y otra información en cada elemento de la lista, y podemos configurar eventos de clic para cada elemento de la lista, como realizar una llamada o enviar un mensaje de texto.

  2. Lista de productos: las aplicaciones de comercio electrónico normalmente necesitan mostrar una gran cantidad de información del producto. A través de la vista de lista, podemos mostrar productos en un diseño claro, incluido el nombre del producto, el precio, las imágenes, etc. Los usuarios pueden buscar productos a través de la lista de desplazamiento y seleccionar los productos de su interés para comprarlos o ver los detalles.

  3. Lista de mensajes: las aplicaciones de chat o de notificación normalmente necesitan mostrar una gran cantidad de registros de mensajes. A través de la vista de lista, podemos mostrar los mensajes en orden cronológico y mostrar el remitente, el contenido, la hora y otra información en cada elemento de la lista. Los usuarios pueden desplazarse por la lista para ver el historial de mensajes y realizar respuestas u otras operaciones.

  4. Interfaz de configuración: la interfaz de configuración a menudo contiene múltiples opciones o elementos de función. A través de la vista de lista, podemos mostrar cada elemento de configuración en forma de lista, lo que permite a los usuarios explorar y cambiar fácilmente varias configuraciones de la aplicación.

Además de los escenarios anteriores, las vistas de lista también se pueden utilizar para mostrar varios tipos de datos, como listas de reproducción de música, catálogos de libros y listas de noticias. Con un diseño de interacción y diseño adecuados, las vistas de lista pueden brindar una buena experiencia de usuario y ayudarlos a encontrar la información que necesitan de manera rápida y precisa.

2. Principio de funcionamiento y método de funcionamiento de la vista de lista.

La vista de lista es un componente de interfaz de usuario comúnmente utilizado en el desarrollo de Android, que se utiliza para mostrar listas de datos grandes. Sus principios y métodos de trabajo incluyen principalmente los siguientes aspectos:

  1. Fuente de datos: las vistas de lista requieren una fuente de datos para proporcionar los datos mostrados. La fuente de datos puede ser una matriz, una colección o una base de datos, etc. Cada elemento de datos representa una entrada en la lista.

  2. Adaptador: el adaptador es el puente entre la fuente de datos y la vista de lista. Es responsable de asociar elementos de datos con vistas de elementos de lista para que los datos se muestren correctamente. Los adaptadores pueden heredar de la clase BaseAdapter o utilizar clases de adaptadores preestablecidos como ArrayAdapter y CursorAdapter.

  3. Vista de elementos de lista: cada elemento de datos corresponderá a una vista de elementos de lista, que se utiliza para mostrar contenido de datos específico. Las vistas de elementos de lista se pueden definir a través de archivos de diseño o crearse dinámicamente usando código. Por lo general, contiene múltiples controles (como TextView, ImageView, etc.) para mostrar varias propiedades de elementos de datos.

  4. Reutilización de elementos de la lista: para mejorar el rendimiento y reducir el uso de memoria, el sistema Android adopta un mecanismo de reutilización de elementos de la lista. A medida que la lista se desplaza, los elementos de la lista que se extienden más allá de la pantalla se reciclan y reutilizan en lugar de crear nuevos elementos de la lista cada vez. Este mecanismo debe implementarse en el método getView() del adaptador.

  5. Evento de clic del elemento de la lista: la vista de lista puede escuchar el evento de clic del usuario en el elemento de la lista. Cuando el usuario hace clic en un elemento de la lista, se puede configurar un oyente para que realice las operaciones correspondientes, como abrir una nueva interfaz, mostrar información detallada, etc.

  6. Actualización de la vista de lista: cuando la fuente de datos cambia, la vista de lista debe notificarse a tiempo para actualizarse. Esto se puede lograr llamando al método notifyDataSetChanged() del adaptador, que activa la vista de lista para recargar los datos y actualizar la interfaz.

       [Figura 1 Diagrama esquemático del adaptador]

En general, el flujo de trabajo de una vista de lista es el siguiente:

  1. Preparar fuentes de datos, incluida la obtención de datos o la consulta de datos de bases de datos.
  2. Cree un adaptador y asocie la fuente de datos con el adaptador.
  3. Configure el adaptador en la vista de lista.
  4. La vista de lista crea una cantidad correspondiente de vistas de elementos de lista según la cantidad de elementos de datos en el adaptador.
  5. Cuando se desplaza la lista, el mecanismo de reutilización de elementos de la lista reutilizará la vista de elementos de la lista ya creada para mejorar el rendimiento.
  6. La vista de elementos de lista muestra contenido basado en los datos de la fuente de datos.
  7. El usuario interactúa con los elementos de la lista, como hacer clic en un elemento de la lista.
  8. Actualice la fuente de datos según sea necesario y luego notifique al adaptador las actualizaciones de datos.
  9. Después de que el adaptador recibe la notificación de actualización de datos, activa la vista de lista para recargar los datos y actualizar la interfaz.

Al comprender y dominar los principios y métodos de trabajo de las vistas de lista, los desarrolladores pueden utilizar y personalizar mejor las vistas de lista para lograr diversos requisitos complejos de visualización de datos.

3. Preparar fuentes de datos

        Defina la clase de modelo de datos: cree una clase de modelo de datos para representar cada elemento de la lista. Esta clase debe contener propiedades y métodos relacionados con el proyecto.

public class Item {
    private String title;  // 标题
    private String description;  // 描述

    // 构造函数、Getter 和 Setter 方法等

    // 可以根据需要扩展其他属性和方法
}

4. Uso del adaptador

El adaptador juega un papel muy importante en la vista de lista: es responsable de asociar la fuente de datos con la vista de lista y decidir cómo mostrar los datos en los elementos de la lista. A continuación se muestra un ejemplo de uso básico del adaptador:

  1. Prepare la fuente de datos: primero, prepare una matriz o colección que contenga datos como fuente de datos. Por ejemplo, podemos crear un ArrayList que almacene cadenas como fuente de datos:
    ArrayList<String> dataList = new ArrayList<>(); 
    dataList.add("Item 1"); 
    dataList.add("Item 2"); 
    dataList.add("Item 3");
  2. Cree un adaptador: a continuación, cree una clase de adaptador y herede de BaseAdapter o sus subclases (como ArrayAdapter, CursorAdapter, etc.). En la clase de adaptador, necesitamos implementar varios métodos clave.
    public class MyAdapter extends BaseAdapter { 
        private ArrayList<String> mDataList; 
        public MyAdapter(ArrayList<String> dataList) { 
            mDataList = dataList; 
        } 
    
        @Override 
        public int getCount() { 
            return mDataList.size(); 
        } 
    
        @Override 
        public Object getItem(int position) { 
            return mDataList.get(position); 
        } 
    
        @Override 
        public long getItemId(int position) { 
            return position; 
        } 
    
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { // 创建或复用列表项视图 
            if (convertView == null) {
      convertView=LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, false); 
        } 
            // 获取当前位置的数据项 
            String item = (String) getItem(position); // 在列表项视图中显示数据                     
            TextView textView = convertView.findViewById(R.id.text_view); 
            textView.setText(item); 
            return convertView; 
        } 
    }
    1.  En el ejemplo anterior, creamos un adaptador personalizado MyAdapterque contiene los métodos necesarios:
      • getCount(): Devuelve el número de elementos de datos.
      • getItem(): Devuelve el elemento de datos en la posición correspondiente.
      • getItemId(): Devuelve el ID del elemento de datos. Este ID se puede usar para manejar eventos de clic y otros requisitos. La posición del elemento de datos generalmente se usa como ID.
      • getView(): cree o reutilice una vista de elementos de lista y muestre datos en ella.
  3. Configure el adaptador: busque el control ListView correspondiente en Actividad o Fragmento y configure el adaptador.
    1.  
      ListView listView = findViewById(R.id.list_view); 
      MyAdapter adapter = new MyAdapter(dataList); // dataList是前面创建的数据源 listView.setAdapter(adapter);
    2. A través de los pasos anteriores, hemos completado el uso básico del adaptador y los datos en la fuente de datos se mostrarán en cada elemento de la lista en la vista de lista.
  4. Actualización de datos: si la fuente de datos es dinámica y puede cambiar con el tiempo, se debe notificar al adaptador para que actualice la lista después de actualizar los datos.
// 动态更改数据源 
itemList.add(new Item("标题4", "描述4")); 
adapter.notifyDataSetChanged();

5. Vista de lista en el archivo de diseño

En los archivos de diseño de Android, puede utilizar el elemento ListView para definir y configurar vistas de lista. A continuación se muestra un ejemplo sencillo para demostrar cómo escribir una vista de lista en un archivo de diseño:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"                             
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <!-- 其他布局元素 --> 
    <ListView 
        android:id="@+id/listView" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" /> 

</LinearLayout>

En el ejemplo anterior, LinearLayout se utiliza como diseño raíz, que contiene otros elementos de diseño (se pueden agregar según las necesidades reales) y un elemento ListView. En el elemento ListView, puede configurar las propiedades correspondientes según sea necesario.

Las propiedades ListView más utilizadas incluyen:

  • android:id: Asigne un identificador único a ListView.
  • android:layout_widthy android:layout_height: se utiliza para establecer el ancho y el alto de ListView.
  • android:dividery android:dividerHeight: se puede utilizar para establecer la línea separadora entre los elementos de la lista y su altura.
  • android:listSelector: Se utiliza para establecer el color o estilo de fondo cuando se selecciona un elemento de la lista.
  • android:scrollbars: Se puede utilizar para configurar el modo de visualización de la barra de desplazamiento.

Además del elemento ListView en sí, también se necesita un adaptador (Adaptador) para proporcionar datos para la lista. El adaptador es responsable de asociar datos con la vista de lista para que los datos se puedan mostrar correctamente en la lista. Las operaciones específicas de configuración del adaptador y enlace de datos generalmente se completan en código Java.

Cabe señalar que a partir de Android 10 (nivel de API 29), Google recomienda utilizar  RecyclerView  como un componente de vista de lista más flexible y eficiente. RecyclerView proporciona más funciones y opciones de optimización y puede reemplazar el ListView tradicional. Si la versión mínima admitida del dispositivo de destino de su aplicación es superior a Android 10, se recomienda utilizar RecyclerView en lugar de ListView.

6. Personalizar el diseño de los elementos de la lista

La personalización del diseño de los elementos de la lista se realiza mediante la creación de un archivo XML para definir la apariencia y el diseño de la vista de los elementos de la lista. A continuación se muestra un ejemplo sencillo que muestra cómo crear un diseño de elemento de lista personalizado:

  1. Cree un nuevo archivo XML:res/layout cree un nuevo archivo XML en el directorio del proyecto de Android y asígnele un nombre list_item_layout.xml(puede nombrarlo según las necesidades reales).

  2. Defina el diseño de los elementos de la lista: en list_item_layout.xmlel archivo, utilice varios diseños y controles para definir la apariencia de los elementos de la lista. A continuación se muestra un ejemplo que contiene un TextView como contenido de visualización de un elemento de lista:

<!-- list_item_layout.xml --> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"             
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="8dp"> 
        <TextView 
            android:id="@+id/text_view" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content" 
            android:textSize="16sp" 
            android:textColor="@android:color/black" /> 
</LinearLayout>

En el ejemplo anterior, utilizamos LinearLayout como contenedor, que contiene un TextView para mostrar el contenido de texto de los elementos de la lista. Puede agregar más diseños y controles según sea necesario para lograr diferentes estilos y efectos interactivos.

     3. Utilice un diseño personalizado en el adaptador: en el getView()método del adaptador, cargue el archivo de diseño personalizado como una vista y complete y configure los datos según sea necesario.

@Override public View getView(int position, View convertView, ViewGroup parent) { 
    // 创建或复用列表项视图 
    if (convertView == null) { 
           convertView=
                LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, false); 
} 
    // 获取当前位置的数据项 
    String item = (String) getItem(position); 
    // 在列表项视图中显示数据 
    TextView textView = convertView.findViewById(R.id.text_view); 
    textView.setText(item); 
    return convertView; 
}

En el código anterior, usamos LayoutInflaterel inflate()método para cargar el archivo de diseño de elementos de lista personalizado como una vista y findViewById()encontrar el control TextView en él a través del método. Luego podemos setText()configurar los datos del adaptador en TextView mediante métodos.

Después de completar los pasos anteriores, creó con éxito un diseño de elementos de lista personalizado y lo utilizó en el adaptador para mostrar el contenido de los elementos de la lista.

7. Procesamiento de eventos de clic de elemento de lista

Para manejar eventos de clic para un elemento de la lista, puede configurar un detector de clics para el elemento de la lista en el adaptador . A continuación se muestra un ejemplo que muestra cómo manejar el evento de clic de un elemento de la lista en un adaptador:

       getView()1. Configure un detector de clics para el elemento de la lista en el método del adaptador :

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { // 创建或复用列表项视图 
    if (convertView == null) { 
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, false); 
} 
    // 获取当前位置的数据项 
    String item = (String) getItem(position); 
    // 在列表项视图中显示数据 
    TextView textView = convertView.findViewById(R.id.text_view); textView.setText(item); 
    // 设置点击监听器 
    convertView.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { // 处理列表项点击事件 
            // 在这里编写点击事件处理的代码 
            // 可以使用position参数获取当前点击的列表项位置 
        } 
    }); 
    return convertView; 
}
En el código anterior, configuramos convertViewun detector de clics (la vista de elementos de la lista) y onClick()escribimos el código para manejar el evento de clic en el método. Puede escribir aquí la lógica de clic para los elementos de la lista en el adaptador si es necesario.

Tenga en cuenta que utilizamos positionparámetros para obtener la posición del elemento de la lista en el que se hace clic actualmente. Esto puede ayudarle a identificar en qué elemento de la lista hizo clic el usuario y actuar en consecuencia .

        2. Agregue lógica de procesamiento de eventos de clic: agregue lógica de procesamiento de eventos de clic específica al onClick()método en el adaptador. Por ejemplo, puede abrir una nueva Actividad o Fragmento para mostrar información detallada o realizar otras operaciones.

convertView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { // 处理列表项点击事件 
        // 在这里编写点击事件处理的代码 
        // 可以使用position参数获取当前点击的列表项位置 
        // 例如,打开新的Activity并传递数据 
        String selectedItem = (String) getItem(position); 
        Intent intent = new Intent(v.getContext(), DetailActivity.class);             
        intent.putExtra("selectedItem", selectedItem);     
        v.getContext().startActivity(intent); 
    } 
});

En el ejemplo anterior, obtenemos el elemento de datos seleccionado según la posición del elemento de la lista en el que hizo clic el usuario, luego creamos un Intent que contiene los datos y lo pasamos como parámetro a la nueva Actividad (DetailActivity). Puedes modificarlo y ampliarlo según tus necesidades.

8. Optimización de listas

La optimización de las vistas de lista puede mejorar el rendimiento de su aplicación y la experiencia del usuario. Las siguientes son algunas funciones comunes relacionadas con la vista de lista, incluida cómo implementar el filtrado de búsqueda, la actualización desplegable y los menús deslizantes:

  1. Función de filtro de búsqueda:

    • Cree un cuadro de búsqueda (EditText) para recibir entradas del usuario.
    • Escuche el evento de cambio de texto del cuadro de búsqueda y active la operación de filtrado cuando cambie el texto.
    • Según las palabras clave ingresadas por el usuario, la fuente de datos se filtra en el adaptador para obtener resultados coincidentes.
    • Actualiza el conjunto de datos del adaptador para mostrar solo los elementos de la lista que coinciden con los criterios de búsqueda.
  2. Función de actualización desplegable:

    • Utilice SwipeRefreshLayout como contenedor principal de la vista de lista, que proporciona la función de actualización desplegable.
    • Configure el oyente OnRefreshListener para que active la operación de actualización cuando el usuario despliegue la lista.
    • Realice operaciones de actualización en el oyente, como recargar datos o realizar solicitudes de red.
    • Cuando se complete la actualización, llame al setRefreshing(false)método SwipeRefreshLayout para finalizar el estado de actualización.
  3. Función de menú deslizante lateral:

    • Utilice bibliotecas de terceros, como ItemTouchHelper de RecyclerView, para implementar la función del menú deslizante lateral.
    • Configure la devolución de llamada ItemTouchHelper.Callback en el adaptador para escuchar el evento deslizante del elemento de la lista.
    • Maneje eventos de deslizamiento en el método de devolución de llamada, como mostrar un botón de eliminación o una opción de menú al deslizar el dedo hacia la derecha.
    • Según las acciones del usuario, realice las acciones correspondientes, como eliminar elementos de la lista o mostrar más opciones.

Además de las características anteriores, también puede considerar las siguientes medidas de optimización para mejorar el rendimiento y la experiencia del usuario de las vistas de lista:

  • Utilice el modo ViewHolder: utilice ViewHolder en el adaptador para reutilizar vistas, reducir el costo de creación de vistas y mejorar la fluidez del desplazamiento.
  • Carga de paginación: cuando hay muchos elementos de la lista, la carga de paginación se puede utilizar para cargar datos a pedido para evitar el retraso causado por la carga de una gran cantidad de datos a la vez.
  • Optimización de la carga de imágenes: utilice una biblioteca de carga de imágenes (como Glide o Picasso) para cargar y almacenar en caché las imágenes de forma asincrónica para evitar realizar operaciones que consumen mucho tiempo en el hilo principal.

10. Código de muestra y demostración.

Aquí analizamos principalmente tres listas:

  • Lista simple: ArrayAdapter
  • Lista de imágenes y texto--SimpleAdapter
  • Lista compleja de gráficos y texto: BaseAdapter ( punto clave )

[Efecto de demostración] :

Aplicación ListView

  [Código central] :

1. Clase ItemBean

Cree un paquete bena, cree una clase ItemBean en este directorio de paquetes y defina el título, el contenido y las imágenes del artículo.

public class ItemBean implements Serializable {

    private String title; // 标题
    private String content; // 内容
    private int imgResId; // 图片


    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getImgResId() {
        return imgResId;
    }

    public void setImgResId(int imgResId) {
        this.imgResId = imgResId;
    }

    @Override
    public String toString() {
        return "ItemBean{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", imgResId=" + imgResId +
                '}';
    }
}

2.Botón de inicio

Edite el siguiente código en el archivo Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginRight="10dp"
        android:orientation="vertical"
        android:paddingLeft="10dp">

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="Array列表"
            android:onClick="toArrayListTest"
            android:textAllCaps="false" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="simple列表"
            android:onClick="toSimpleListTest"
            android:textAllCaps="false" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="BaseAdapter列表"
            android:onClick="toBaseListTest"
            android:textAllCaps="false" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="FensiList列表"
            android:onClick="toFrensiListActivity"
            android:textAllCaps="false" />
    </LinearLayout>
</ScrollView>

 [Efecto de página]:

[Figura 2 representación de Activity_main.xml]

3. Agregue un evento de clic en la clase del programa principal para saltar a la vista de lista correspondiente.

        (1) Cree 5 actividades vacías y asígneles un nombre respectivamente:

[Figura 3 Diagrama del catálogo de actividades]

         (2) Agregue un evento de clic a la clase del programa principal MainActivty y salte a la vista de lista correspondiente

 public void toArrayListTest(View view) {
        Intent intent = new Intent(this, ArrayListActivity.class);
        startActivity(intent);
    }

    public void toSimpleListTest(View view) {
        Intent intent = new Intent(this, SimpleListActivity.class);
        startActivity(intent);
    }

    public void toBaseListTest(View view) {
        Intent intent = new Intent(this, BaseAdapterActivity.class);
        startActivity(intent);
    }

    public void toFrensiListActivity(View view) {
        Intent intent = new Intent(this, FensiListActivity.class);
        startActivity(intent);
    }

         (3) Defina la vista ListView en los tres archivos actividad_array_list.xml, actividad_base_adapter.xml y actividad_simple_list.xml en el directorio res/layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".BaseAdapterActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

        (4) Cree un nuevo archivo xml en el directorio res/layout y asígnele el nombre list_item_layout.xml 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="10dp"
    android:paddingTop="5dp"
    android:paddingRight="10dp"
    android:paddingBottom="5dp">

    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_launcher_background" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@id/iv_img"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="雨中漫步"
        android:textSize="20sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_title"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@id/iv_img"
        android:ellipsize="end"
        android:maxLines="3"
        android:text="人生就像一场旅行,不必在乎目的地,在乎的是沿途的风景以及看风景的心情,让心灵去旅行"
        android:textSize="16sp" />
</RelativeLayout>

【Representación】:

  [Figura 4 Elementos de lista personalizados]

 4. Lista simple: ArrayAdapter

        ( 1) Cree un nuevo paquete de adaptador y cree un nuevo adaptador MyAdapter en este directorio de paquete   , que se utiliza para la actividad ArrayListActivity.

public class MyAdapter extends BaseAdapter {

    private List<ItemBean> mBeanList;
    private LayoutInflater mLayoutInflater;
    private Context mContext;

    public MyAdapter(Context context,List<ItemBean> beanList){
        this.mContext = context;
        this.mBeanList = beanList;
        mLayoutInflater = LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
        return mBeanList.size();
    }

    @Override
    public Object getItem(int position) {
        return mBeanList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 创建视图控件
        convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);
        ImageView imageView = convertView.findViewById(R.id.iv_img);
        TextView tvTitle = convertView.findViewById(R.id.tv_title);
        TextView tvContent = convertView.findViewById(R.id.tv_content);

        // 为控件填充数据
        ItemBean itemBean = mBeanList.get(position);
        imageView.setImageResource(itemBean.getImgResId());
        tvTitle.setText(itemBean.getTitle());
        tvContent.setText(itemBean.getContent());

        return convertView;
    }
}

Análisis de código:

        La clase MyAdapter aquí hereda de BaseAdapter e implementa varios de sus métodos. Podemos personalizar el diseño y el estilo de los elementos de la lista completando los datos de la subvista para cada elemento de la lista en el método getView().

En el método getView (), primero verifique si convertView está vacío. Si está vacío, use LayoutInflater para R.layout.list_item_layoutcrear una nueva vista a partir del archivo de diseño. Luego, obtenga los controles en el diseño de la subvista a través del método findViewById() y vincule estos controles a los datos en la fuente de datos.

        Entre ellos, ItemBean es una clase de modelo de datos personalizada que se utiliza para almacenar los datos de cada elemento de la lista. Obtenga el objeto ItemBean en la posición correspondiente llamando al método getItem () y luego use el método del objeto para obtener los datos correspondientes y configurarlos en el control de subvista.

        Finalmente, el objeto de vista lleno de datos se devuelve para que ListView lo muestre.

          (2).Editar la clase ArrayListActivity

public class ArrayListActivity extends AppCompatActivity {

    private ListView mListView;
    private List<String> mStringList;
    private ArrayAdapter<String> mArrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_array_list);
        mListView = findViewById(R.id.lv);
        mStringList = new ArrayList<>();

        for (int i = 0; i < 50; i++) {
            mStringList.add("这是条目" + i);
        }
        mArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mStringList);

        mListView.setAdapter(mArrayAdapter);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(ArrayListActivity.this,"你点击了"+position,Toast.LENGTH_SHORT).show();
            }
        });


        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(ArrayListActivity.this,"你长按了"+position,Toast.LENGTH_SHORT).show();

                return true;
            }
        });
    }
}

Análisis de código: 

        En el método onCreate(), primero configure el archivo de diseño en Activity_array_list.xml mediante el método setContentView(). Luego, use el método findViewById() para obtener una instancia del control ListView.

        A continuación, creamos un objeto ArrayList como fuente de datos y le agregamos 50 cadenas de entrada usando un bucle for. Luego, cree un objeto ArrayAdapter, asócielo con la fuente de datos y configure el adaptador en el control ListView para mostrar los datos.

        Al mismo tiempo, también configuramos detectores de eventos de clic y eventos de pulsación larga para los elementos de la lista. Cuando el usuario hace clic en el elemento de la lista, aparecerá un cuadro de aviso de Toast para mostrar la posición actual en la que se hizo clic. Cuando el usuario mantiene presionado un elemento de la lista, también aparecerá un cuadro de aviso de Toast para mostrar la posición actual presionada durante mucho tiempo.

        De esta manera, la clase ArrayListActivity completa una visualización de lista simple basada en ArrayList y proporciona la lógica de procesamiento correspondiente para eventos de clic y eventos de pulsación larga de elementos de la lista.

5. Lista de imágenes y texto: SimpleAdapter

        (1) Adaptador de actividad SimplListActivity  MyAdapter2 

Debido a que cuando se usa el adaptador ListView, convertView generalmente se usa para reutilizar vistas, puede haber casos en los que convertView esté vacío, lo que indica que actualmente no hay una vista reutilizable.

Por lo tanto, basándonos en la clase MyAdapter, cambiamos parte del código que crea el control de vista en el método getView(),

Determine si convertView está vacío. Si convertView está vacío, significa que actualmente no hay una vista reutilizable y es necesario crear una nueva vista.

// 创建视图控件
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);
        }

        (2) SimpleListActivity

public class SimpleListActivity extends AppCompatActivity {

    private ListView mListView;
    private SimpleAdapter mSimpleAdapter;
    private List<Map<String, Object>> mList;

    private int[] imgs = {
            R.drawable.test1,
            R.drawable.test2,
            R.drawable.test3,
            R.drawable.test4,
            R.drawable.test5,
            R.drawable.test6,
            R.drawable.test7,
            R.drawable.test8,
            R.drawable.test9
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple_list);
        mListView = findViewById(R.id.lv);

        mList = new ArrayList<>();

        for (int i = 0; i < 50; i++) {
            Map<String, Object> map = new HashMap();
            map.put("img", imgs[i % imgs.length]);
            map.put("title", "这是标题" + i);
            map.put("content", "这是内容" + i);

            mList.add(map);
        }

        mSimpleAdapter = new SimpleAdapter(this,
                mList,
                R.layout.list_item_layout,
                new String[]{"img", "title", "content"},
                new int[]{R.id.iv_img, R.id.tv_title, R.id.tv_content}
        );

        mListView.setAdapter(mSimpleAdapter);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Map<String, Object> map = mList.get(position);
                String title = (String) map.get("title");
                Toast.makeText(SimpleListActivity.this, "你点击了" + position + title, Toast.LENGTH_SHORT).show();

            }
        });

    }
}

 Análisis de código:

        En el método onCreate(), primero configure el archivo de diseño en Activity_simple_list.xml mediante el método setContentView(). Luego use el método findViewById() para obtener una instancia del control ListView.

        A continuación, creamos un objeto ArrayList como fuente de datos mList y le agregamos 50 entradas mediante un bucle. Cada entrada es un objeto HashMap, que contiene información como imágenes, títulos y contenido.

Luego, se crea un objeto SimpleAdapter mSimpleAdapter y se asocia con la fuente de datos mList. Al construir el objeto SimpleAdapter, especificamos el archivo de diseño list_item_layout.xml del elemento de la lista, así como las claves correspondientes a cada dato en la fuente de datos mList y el ID de control en el diseño del elemento de la lista.

        Finalmente, configure SimpleAdapter en el control ListView para mostrar los datos. Al mismo tiempo, también configuramos un detector de eventos de clic para el elemento de la lista. Cuando el usuario hace clic en un elemento de la lista, el elemento de datos en la posición en la que se hizo clic actualmente se obtendrá a través del método getItem(), y luego se eliminará la información del título y aparecerá un cuadro emergente para mostrar la posición en la que se hizo clic actualmente. y título.

        De esta manera, la clase SimpleListActivity completa una visualización de lista simple basada en SimpleAdapter y proporciona la lógica de procesamiento correspondiente para el evento de clic del elemento de la lista.

6. Lista compleja de gráficos y texto: BaseAdapter ( punto clave )

        (1) Adaptador de actividad BaseAdapterActivity MyAdapter3

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 创建视图控件
        ViewHolder viewHolder = new ViewHolder();
        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false);
            ImageView imageView = convertView.findViewById(R.id.iv_img);
            TextView tvTitle = convertView.findViewById(R.id.tv_title);
            TextView tvContent = convertView.findViewById(R.id.tv_content);
            viewHolder.imageView = imageView;
            viewHolder.tvTitle = tvTitle;
            viewHolder.tvContent = tvContent;
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        // 为控件填充数据
        ItemBean itemBean = mBeanList.get(position);
        viewHolder.imageView.setImageResource(itemBean.getImgResId());
        viewHolder.tvTitle.setText(itemBean.getTitle());
        viewHolder.tvContent.setText(itemBean.getContent());

        return convertView;
    }

    class ViewHolder {
        ImageView imageView;
        TextView tvTitle;
        TextView tvContent;
    }

  Análisis de código:

        En el método getView(), primero se crea una clase interna llamada ViewHolder para almacenar cada instancia de control en el diseño del elemento de la lista.

        Luego, bajo la condición de juzgar si convertView está vacío, se realizan dos operaciones de bifurcación:

  •  Cuando convertView está vacío, significa que es necesario crear el elemento de la lista actual. Convierta el archivo de diseño list_item_layout.xml en un objeto Ver mediante el método inflate() de LayoutInflater y busque los controles ImageView y TextView en él. Asigne sus instancias a las variables miembro correspondientes de ViewHolder y adjunte el objeto ViewHolder a convertView mediante el método setTag() para que pueda recuperarse más tarde utilizando el método getTag().
  • Cuando convertView no está vacío, significa que el elemento de la lista actual se puede reutilizar. Utilice directamente el método getTag() para recuperar el objeto ViewHolder previamente almacenado de convertView.

        Al completar datos en el control en ViewHolder, obtenga el objeto ItemBean en la ubicación actual a través del método getItem() y recupere el ID del recurso de imagen, el título y la información del contenido del mismo. Luego, configure esta información en los controles correspondientes en ViewHolder respectivamente, completando el llenado de datos.

        Finalmente, el convertView lleno de datos se devuelve para mostrarlo en la lista.

De esta manera, el método getView () se reescribe en SimpleAdapter para realizar la creación dinámica y la reutilización del diseño del elemento de la lista y completar correctamente los datos en el control, de modo que la lista pueda mostrar los datos correctamente. Al mismo tiempo, usar el modo ViewHolder puede mejorar el rendimiento de desplazamiento de la lista.

         (2) Edite el archivo Activity_news_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        tools:context=".NewsDetailActivity">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center"
            android:text="林间漫步"
            android:textSize="25sp"
            android:textStyle="bold" />

        <ImageView
            android:id="@+id/iv_img"
            android:layout_width="400dp"
            android:layout_height="300dp"
            android:layout_marginTop="10dp"
            android:scaleType="centerCrop"
            android:src="@color/colorPrimaryDark" />

        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="40dp"
            android:gravity="start|left"
            android:text="一根线如果绷得太紧,总有一天会断裂,一颗心若是禁锢得太久,总有一天会失去平衡,我们需要放飞心灵,让心翱翔在自由的太空。"
            android:textSize="16sp"

            />

    </LinearLayout>
</ScrollView>

[Representación]:

 [Figura 5 representación de Activity_news_detail.xml]

 

         (3) NewsDetailActivity

package com.sziiit.listview_demo1;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.sziiit.listview_demo1.adapter.MyAdapter3;
import com.sziiit.listview_demo1.bean.ItemBean;

import java.util.ArrayList;
import java.util.List;

public class BaseAdapterActivity extends AppCompatActivity {

    private ListView mListView;
    private List<ItemBean> mBeanList;
    private MyAdapter3 mMyAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);

        initView();
        initData();
        initEvent();
    }

    private void initEvent() {
        mMyAdapter = new MyAdapter3(this,mBeanList);
        mListView.setAdapter(mMyAdapter);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ItemBean itemBean = mBeanList.get(position);
                String title = itemBean.getTitle();
                Intent intent = new Intent(BaseAdapterActivity.this, NewsDetailActivity.class);
                intent.putExtra("item",itemBean);
                startActivity(intent);

                Toast.makeText(BaseAdapterActivity.this, "你点击了" + position + title, Toast.LENGTH_SHORT).show();
            }
        });
        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                return false;
            }
        });
    }

    private void initData() {
        mBeanList = new ArrayList<>();

        ItemBean newsBean1 = new ItemBean();
        newsBean1.setTitle("雨中漫步");
        newsBean1.setContent("人生就像一场旅行,不必在乎目的地,在乎的是沿途的风景以及看风景的心情,让心灵去旅行。\n只想进行一场漫无目的的旅行,在一个有花有海、安静缓慢的地方晒着太阳无所事事。\n背着背包的路上,看过许多人,听过许多故事,见过旅行风景,就这样,慢慢学会了长大。");
        newsBean1.setImgResId(R.drawable.test1);

        ItemBean newsBean2 = new ItemBean();
        newsBean2.setTitle("林间穿梭");
        newsBean2.setContent("只想进行一场漫无目的的旅行,在一个有花有海、安静缓慢的地方晒着太阳无所事事。\n路旁边浪似地滚着高高低低的黄土。太阳给埋在黄土里,发着肉红色。可是太阳还烧得怪起劲的,把他们的皮肉烧得变成紫黑色,似乎还闻得到一股焦味儿。");
        newsBean2.setImgResId(R.drawable.test2);

        ItemBean newsBean3 = new ItemBean();
        newsBean3.setTitle("旅行花海");
        newsBean3.setContent("只想进行一场漫无目的的旅行,在一个有花有海、安静缓慢的地方晒着太阳无所事事。\n背着背包的路上,看过许多人,听过许多故事,见过旅行风景,就这样,慢慢学会了长大。\n" +
                "\n" +
                "想呼吸着每座城市的空气,想感受着每座城市的人儿,想看着每座城市的风景。");
        newsBean3.setImgResId(R.drawable.test3);


        ItemBean newsBean4 = new ItemBean();
        newsBean4.setTitle("非平衡的线");
        newsBean4.setContent("一根线如果绷得太紧,总有一天会断裂,一颗心若是禁锢得太久,总有一天会失去平衡,我们需要放飞心灵,让心翱翔在自由的太空。每个人在他的人生发轫之初,总有一段时光,没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。");
        newsBean4.setImgResId(R.drawable.test4);

        ItemBean newsBean5 = new ItemBean();
        newsBean5.setTitle("说走就走");
        newsBean5.setContent("说走就走的旅行,要么缘由幸福稳定和宽裕,要么祸起无力无奈和逃避。\n在旅途中,我遇见了你,你我相识是缘分!看着你手中的戒指,你说,你可以把它取下来吗?当我要取的时候,你淘气的躲开了,你说只有有缘人才可以取下,我看着你手中的戒指,想做你的有缘人,可是我知道结果是惨淡的,但还是心存希望!");
        newsBean5.setImgResId(R.drawable.test5);

        ItemBean newsBean6 = new ItemBean();
        newsBean6.setTitle("美好的记忆");
        newsBean6.setContent("旅行不在乎终点,而是在意途中的人和事还有那些美好的记忆和景色。人生就是一次充满未知的旅行,在乎的是沿途的风景,在乎的是看风景的心情,旅行不会因为美丽的风景终止。走过的路成为背后的风景,不能回头不能停留,若此刻停留,将会错过更好的风景,保持一份平和,保持一份清醒。享受每一刻的感觉,欣赏每一处的风景,这就是人生。(作者:《遇到另一种生活》");
        newsBean6.setImgResId(R.drawable.test6);

        ItemBean newsBean7 = new ItemBean();
        newsBean7.setTitle("久违的感动");
        newsBean7.setContent("人生最好的旅行,就是你在一个陌生的地方,发现一种久违的感动。人生最好的旅行,就是你在一个陌生的地方,发现一种久违的感动");
        newsBean7.setImgResId(R.drawable.test7);

        ItemBean newsBean8 = new ItemBean();
        newsBean8.setTitle("流浪日记");
        newsBean8.setContent("着背包的路上,看过许多人,听过许多故事,见过旅行风景,就这样,慢慢学会了长大。\n每个人在他的人生发轫之初,总有一段时光,没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。");
        newsBean8.setImgResId(R.drawable.test8);

        ItemBean newsBean9 = new ItemBean();
        newsBean9.setTitle("山的尽头");
        newsBean9.setContent("在向山靠近一点,才发现这座山,好象一位诗人遥望远方,等待故人的归来。山上的树,大多数是松树比较突出。松树亭亭玉立的耸立在周围小草小花的中间,仿佛松树就是一位威风的将军,守护着国家的国民。\n在向山靠近一点,才发现这座山,好象一位诗人遥望远方,等待故人的归来。山上的树,大多数是松树比较突出。松树亭亭玉立的耸立在周围小草小花的中间,仿佛松树就是一位威风的将军,守护着国家的国民。\n在向山靠近一点,才发现这座山,好象一位诗人遥望远方,等待故人的归来。山上的树,大多数是松树比较突出。松树亭亭玉立的耸立在周围小草小花的中间,仿佛松树就是一位威风的将军,守护着国家的国民。");
        newsBean9.setImgResId(R.drawable.test9);

        ItemBean newsBean10 = new ItemBean();
        newsBean10.setTitle("秦河魅影");
        newsBean10.setContent("秦淮河、夫子庙,繁华依旧,只少了些当年桨声灯影的风味。喝一碗鸭血粉丝,吃一客蟹黄汤包,坐一次龙舟游船,览一河别样风景,发一回思古幽情,我想,这也许就是所谓夜游秦淮的小资情调了。独游,却只有看客的心情。\n秦淮河、夫子庙,繁华依旧,只少了些当年桨声灯影的风味。喝一碗鸭血粉丝,吃一客蟹黄汤包,坐一次龙舟游船,览一河别样风景,发一回思古幽情,我想,这也许就是所谓夜游秦淮的小资情调了。独游,却只有看客的心情。\n秦淮河、夫子庙,繁华依旧,只少了些当年桨声灯影的风味。喝一碗鸭血粉丝,吃一客蟹黄汤包,坐一次龙舟游船,览一河别样风景,发一回思古幽情,我想,这也许就是所谓夜游秦淮的小资情调了。独游,却只有看客的心情。");
        newsBean10.setImgResId(R.drawable.test10);

        mBeanList.add(newsBean1);
        mBeanList.add(newsBean2);
        mBeanList.add(newsBean3);
        mBeanList.add(newsBean4);
        mBeanList.add(newsBean5);
        mBeanList.add(newsBean6);
        mBeanList.add(newsBean7);
        mBeanList.add(newsBean8);
        mBeanList.add(newsBean9);
        mBeanList.add(newsBean10);
        mBeanList.add(newsBean1);
        mBeanList.add(newsBean2);
        mBeanList.add(newsBean3);
        mBeanList.add(newsBean4);
        mBeanList.add(newsBean5);
        mBeanList.add(newsBean6);
        mBeanList.add(newsBean7);
        mBeanList.add(newsBean8);
        mBeanList.add(newsBean9);
        mBeanList.add(newsBean10);
    }

    private void initView() {
        mListView = findViewById(R.id.lv);
    }
}

         (4) Clase BaseAdapterActivity

public class BaseAdapterActivity extends AppCompatActivity {

    private ListView mListView;
    private List<ItemBean> mBeanList;
    private MyAdapter3 mMyAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_adapter);

        initView();
        initData();
        initEvent();
    }

    private void initEvent() {
        mMyAdapter = new MyAdapter3(this,mBeanList);
        mListView.setAdapter(mMyAdapter);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ItemBean itemBean = mBeanList.get(position);
                String title = itemBean.getTitle();
                Intent intent = new Intent(BaseAdapterActivity.this, NewsDetailActivity.class);
                intent.putExtra("item",itemBean);
                startActivity(intent);

                Toast.makeText(BaseAdapterActivity.this, "你点击了" + position + title, Toast.LENGTH_SHORT).show();
            }
        });
        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                return false;
            }
        });
    }

    private void initData() {
        mBeanList = new ArrayList<>();

        ItemBean newsBean1 = new ItemBean();
        newsBean1.setTitle("雨中漫步");
        newsBean1.setContent("人生就像一场旅行,不必在乎目的地,在乎的是沿途的风景以及看风景的心情,让心灵去旅行。\n只想进行一场漫无目的的旅行,在一个有花有海、安静缓慢的地方晒着太阳无所事事。\n背着背包的路上,看过许多人,听过许多故事,见过旅行风景,就这样,慢慢学会了长大。");
        newsBean1.setImgResId(R.drawable.test1);

        ItemBean newsBean2 = new ItemBean();
        newsBean2.setTitle("林间穿梭");
        newsBean2.setContent("只想进行一场漫无目的的旅行,在一个有花有海、安静缓慢的地方晒着太阳无所事事。\n路旁边浪似地滚着高高低低的黄土。太阳给埋在黄土里,发着肉红色。可是太阳还烧得怪起劲的,把他们的皮肉烧得变成紫黑色,似乎还闻得到一股焦味儿。");
        newsBean2.setImgResId(R.drawable.test2);

        ItemBean newsBean3 = new ItemBean();
        newsBean3.setTitle("旅行花海");
        newsBean3.setContent("只想进行一场漫无目的的旅行,在一个有花有海、安静缓慢的地方晒着太阳无所事事。\n背着背包的路上,看过许多人,听过许多故事,见过旅行风景,就这样,慢慢学会了长大。\n" +
                "\n" +
                "想呼吸着每座城市的空气,想感受着每座城市的人儿,想看着每座城市的风景。");
        newsBean3.setImgResId(R.drawable.test3);


        ItemBean newsBean4 = new ItemBean();
        newsBean4.setTitle("非平衡的线");
        newsBean4.setContent("一根线如果绷得太紧,总有一天会断裂,一颗心若是禁锢得太久,总有一天会失去平衡,我们需要放飞心灵,让心翱翔在自由的太空。每个人在他的人生发轫之初,总有一段时光,没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。");
        newsBean4.setImgResId(R.drawable.test4);

        ItemBean newsBean5 = new ItemBean();
        newsBean5.setTitle("说走就走");
        newsBean5.setContent("说走就走的旅行,要么缘由幸福稳定和宽裕,要么祸起无力无奈和逃避。\n在旅途中,我遇见了你,你我相识是缘分!看着你手中的戒指,你说,你可以把它取下来吗?当我要取的时候,你淘气的躲开了,你说只有有缘人才可以取下,我看着你手中的戒指,想做你的有缘人,可是我知道结果是惨淡的,但还是心存希望!");
        newsBean5.setImgResId(R.drawable.test5);

        ItemBean newsBean6 = new ItemBean();
        newsBean6.setTitle("美好的记忆");
        newsBean6.setContent("旅行不在乎终点,而是在意途中的人和事还有那些美好的记忆和景色。人生就是一次充满未知的旅行,在乎的是沿途的风景,在乎的是看风景的心情,旅行不会因为美丽的风景终止。走过的路成为背后的风景,不能回头不能停留,若此刻停留,将会错过更好的风景,保持一份平和,保持一份清醒。享受每一刻的感觉,欣赏每一处的风景,这就是人生。(作者:《遇到另一种生活》");
        newsBean6.setImgResId(R.drawable.test6);

        ItemBean newsBean7 = new ItemBean();
        newsBean7.setTitle("久违的感动");
        newsBean7.setContent("人生最好的旅行,就是你在一个陌生的地方,发现一种久违的感动。人生最好的旅行,就是你在一个陌生的地方,发现一种久违的感动");
        newsBean7.setImgResId(R.drawable.test7);

        ItemBean newsBean8 = new ItemBean();
        newsBean8.setTitle("流浪日记");
        newsBean8.setContent("着背包的路上,看过许多人,听过许多故事,见过旅行风景,就这样,慢慢学会了长大。\n每个人在他的人生发轫之初,总有一段时光,没有什么可留恋,只有抑制不住的梦想,没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。");
        newsBean8.setImgResId(R.drawable.test8);

        ItemBean newsBean9 = new ItemBean();
        newsBean9.setTitle("山的尽头");
        newsBean9.setContent("在向山靠近一点,才发现这座山,好象一位诗人遥望远方,等待故人的归来。山上的树,大多数是松树比较突出。松树亭亭玉立的耸立在周围小草小花的中间,仿佛松树就是一位威风的将军,守护着国家的国民。\n在向山靠近一点,才发现这座山,好象一位诗人遥望远方,等待故人的归来。山上的树,大多数是松树比较突出。松树亭亭玉立的耸立在周围小草小花的中间,仿佛松树就是一位威风的将军,守护着国家的国民。\n在向山靠近一点,才发现这座山,好象一位诗人遥望远方,等待故人的归来。山上的树,大多数是松树比较突出。松树亭亭玉立的耸立在周围小草小花的中间,仿佛松树就是一位威风的将军,守护着国家的国民。");
        newsBean9.setImgResId(R.drawable.test9);

        ItemBean newsBean10 = new ItemBean();
        newsBean10.setTitle("秦河魅影");
        newsBean10.setContent("秦淮河、夫子庙,繁华依旧,只少了些当年桨声灯影的风味。喝一碗鸭血粉丝,吃一客蟹黄汤包,坐一次龙舟游船,览一河别样风景,发一回思古幽情,我想,这也许就是所谓夜游秦淮的小资情调了。独游,却只有看客的心情。\n秦淮河、夫子庙,繁华依旧,只少了些当年桨声灯影的风味。喝一碗鸭血粉丝,吃一客蟹黄汤包,坐一次龙舟游船,览一河别样风景,发一回思古幽情,我想,这也许就是所谓夜游秦淮的小资情调了。独游,却只有看客的心情。\n秦淮河、夫子庙,繁华依旧,只少了些当年桨声灯影的风味。喝一碗鸭血粉丝,吃一客蟹黄汤包,坐一次龙舟游船,览一河别样风景,发一回思古幽情,我想,这也许就是所谓夜游秦淮的小资情调了。独游,却只有看客的心情。");
        newsBean10.setImgResId(R.drawable.test10);

        mBeanList.add(newsBean1);
        mBeanList.add(newsBean2);
        mBeanList.add(newsBean3);
        mBeanList.add(newsBean4);
        mBeanList.add(newsBean5);
        mBeanList.add(newsBean6);
        mBeanList.add(newsBean7);
        mBeanList.add(newsBean8);
        mBeanList.add(newsBean9);
        mBeanList.add(newsBean10);
        mBeanList.add(newsBean1);
        mBeanList.add(newsBean2);
        mBeanList.add(newsBean3);
        mBeanList.add(newsBean4);
        mBeanList.add(newsBean5);
        mBeanList.add(newsBean6);
        mBeanList.add(newsBean7);
        mBeanList.add(newsBean8);
        mBeanList.add(newsBean9);
        mBeanList.add(newsBean10);
    }

    private void initView() {
        mListView = findViewById(R.id.lv);
    }
}

  Análisis de código:

        En onCreateel método, configure el archivo de diseño e inicialice las vistas, los datos y los detectores de eventos. Luego, en initEventel método, cree el adaptador MyAdapter3y configúrelo en ListView, y configure los detectores de eventos de clic y pulsación larga para ListView.

El adaptador MyAdapter3hereda de BaseAdapter y puede personalizar el efecto de visualización de ListView al reescribir el método correspondiente. Pase Context y data List<ItemBean> en el constructor para su uso posterior. En el método getView, obtenga el objeto ItemBean en la posición correspondiente según la posición, cargue el archivo de diseño a través de LayoutInflater, complete los datos en el control correspondiente y finalmente devuelva la Vista.

11. Resumen y perspectivas

         Después de aprender la vista de lista ListView de Android, tengo una comprensión más profunda del uso y administración de listas. A través de la práctica y la investigación, creé con éxito una lista con múltiples elementos de datos y pude mostrar datos relacionados en la lista. Aprendí a usar adaptadores para conectar datos y vistas y vincularlos a un control ListView. También aprendí a manejar eventos de clic para elementos de la lista y a responder en consecuencia según las acciones del usuario. Además, también aprendí cómo optimizar el rendimiento de la lista y evitar problemas de retraso causados ​​por un volumen excesivo de datos. Al utilizar el patrón ViewHolder y la administración adecuada de la memoria, pude mejorar efectivamente la eficiencia de la lista.

        En el futuro, planeo explorar más a fondo y aplicar funciones y técnicas más avanzadas para ampliar mi conocimiento de las vistas ListView. Primero, planeo aprender a personalizar el diseño y el estilo de los elementos de la lista para satisfacer diferentes necesidades de diseño. Al utilizar archivos y estilos de diseño personalizados, puedo agregar más información y elementos interactivos a cada elemento de la lista, brindando una mejor experiencia de usuario. En segundo lugar, investigaré y practicaré más a fondo la carga de paginación y la carga asincrónica para optimizar la visualización de listas y el rendimiento en grandes volúmenes de datos. Esto permitirá que la lista cargue y muestre grandes cantidades de datos rápidamente y permitirá una experiencia de desplazamiento fluida. Además, también planeo tener una comprensión profunda del uso de RecyclerView, que es un control de lista más flexible y eficiente que puede satisfacer necesidades de visualización de datos más complejas. En última instancia, espero aplicar el conocimiento y las técnicas que he aprendido al desarrollo real de aplicaciones de Android para brindar a los usuarios una mejor visualización de listas y una mejor experiencia interactiva.

Referencias:

[1] Lai Hong, Fundamentos del desarrollo de aplicaciones de Android [M.] Beijing: Electronic Industry Press, 2020.3

[2] http://www.android-studio,org/, comunidad de desarrolladores de Android Android Studio.

Supongo que te gusta

Origin blog.csdn.net/qq_63559792/article/details/131420612
Recomendado
Clasificación