Optimizar la lógica de carga de datos de ListView

Uno, introducción a ListView

Listview es un componente muy importante en el desarrollo de Android. Muestra de forma adaptativa contenido específico de acuerdo con la longitud de los datos en forma de lista. Los usuarios pueden definir libremente el diseño de cada columna de la vista de lista, pero cuando la vista de lista tiene una gran cantidad de datos que se cargarán, ocupará mucha memoria y afectará el rendimiento. En este momento, debe llenar y reutilizar la vista según sea necesario para reducir la creación de objetos.
Muestra el contenido de los datos en forma de lista y puede adaptarse a la visualización de la pantalla de acuerdo con la altura de la lista.

En segundo lugar, la forma de expresión

Inserte la descripción de la imagen aquí

Esta es la forma más simple de ListView. El cuadro negro es el control ListView, que consta de un elemento (contenido del cuadro rojo), y luego puede deslizar hacia abajo para ver muchos elementos.

Tres, principio de funcionamiento

ListView solo se usa como un contenedor (lista) para cargar datos de visualización (es decir, el contenido de los cuadros rojos de arriba, también llamados elementos). El adaptador proporciona los datos específicos del artículo.
Cuando sea necesario mostrar los datos, ListView obtendrá los datos del Adaptador y luego los cargará.
Inserte la descripción de la imagen aquí

Cuatro, adaptador de datos de uso común (adaptador)

1.BaseAdapter

BaseAdapter es el adaptador básico. De hecho, en realidad es una clase abstracta, que generalmente hereda BaseAdapter al personalizar el adaptador. Esta clase tiene cuatro métodos abstractos. Según estos métodos abstractos, el control ListView se utiliza para la adaptación de datos.

Cuatro métodos abstractos de BaseAdapter:

Nombre del método Función descriptiva
public int getCount () Obtener el número total de elementos del artículo
objeto pyblic getItem (posición int) Obtener el objeto de un artículo según la posición
getItemId largo público (posición int) Obtener la identificación de un artículo según la posición
public View getView (posición int, View convertView, ViewGroup principal) Obtenga la vista del elemento correspondiente a la posición correspondiente, la posición es la posición del elemento actual, converView se usa para reutilizar la vista anterior y padre se usa para cargar el diseño XML

2.Adaptador simple

SimpleAdapter hereda de BaseAdapter e implementa y encapsula los cuatro métodos abstractos de BaseAdapter. Por lo tanto, al utilizar SimpleAdapter para la adaptación de datos, solo necesita pasar los parámetros correspondientes en el método de construcción. La información específica del método de construcción SimpleAdapter es la siguiente:

public SimpleAdapter(Context context,List<? extends Map<String,?>> data,int resourse,String[] from,int[] to)

El significado de los 5 parámetros en el método de construcción SimpleAdapter ():

  • contexto: representa el objeto de contexto
  • datos: recopilación de datos, cada elemento de los datos corresponde a los datos de la entrada en el control ListView
  • recurso: ID de recurso del diseño del elemento
  • from: el valor clave en la colección Map
  • a: el control correspondiente en el diseño del artículo

3.ArrayAdapter

ArrayAdapter es también una subclase de BaseAdapter. Su uso es similar a SimpleAdapter. Los desarrolladores solo necesitan pasar los parámetros correspondientes en el constructor. ArrayAdapter se usa generalmente para adaptar el control TextView, como la Configuración (menú de configuración) en el sistema Android. ArrayAdapter tiene varios métodos de construcción, la información específica del método de construcción ArrayAdapter es la siguiente:

public ArrayAdapter(Context context,int resourse);
public ArrayAdapter(Context context,int resourse,int textViewResourceId);
public ArrayAdapter(Context context,int resourse,T[] objects);
public ArrayAdapter(Context context,int resourse,int textViewResourceId,T[] objects);
public ArrayAdapter(Context context,int resourse,List<T> objects);
public ArrayAdapter(Context context,int resourse,int textViewResourceId,List<T> objects);

El significado de los 5 parámetros en el método de construcción ArrayAdapter ():

  • contexto: representa el objeto de contexto
  • recurso: ID de recurso del diseño del elemento
  • textViewResourceId: el id del TextView correspondiente en el diseño del elemento
  • Objetos T []: datos del tipo de matriz que deben adaptarse
  • Objetos de lista: datos de tipo de lista que deben adaptarse

Cinco, método de optimización

Para optimizar la velocidad de carga de la vista de lista, es necesario hacer que convertView coincida con el tipo de lista y reutilizar convertView en la mayor medida posible.

En general, hay tres formas de cargar getview:

1. Redefina un diseño de carga de Vista cada vez y luego cargue los datos (el método de carga más lento)

public View getView(int position, View convertView, ViewGroup parent) {
    
    
 View item = mInflater.inflate(R.layout.list_item_icon_text, null);

 ((TextView) item.findViewById(R.id.text)).setText(DATA[position]);

 ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(

 (position & 1) == 1 ? mIcon1 : mIcon2);

 return item;

}

2. Reutilice directamente cuando convertView no esté vacío

De este modo se reduce una gran cantidad de creación de vistas innecesarias y luego se cargan datos

public View getView(int position, View convertView, ViewGroup parent) {
    
    
 if (convertView == null) {
    
    
 convertView = mInflater.inflate(R.layout.item, parent, false);

 }

 ((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);

 ((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(

 (position & 1) == 1 ? mIcon1 : mIcon2);

 return convertView;

 }

3. Defina un ViewHolder

Establezca la etiqueta de ConvetView en ViewHolder y reutilícela cuando no esté vacía (la forma más rápida)

static class ViewHolder {
    
    
TextView text;

ImageView icon;

}

 

public View getView(int position, View convertView, ViewGroup parent) {
    
    
 ViewHolder holder;

 

 if (convertView == null) {
    
    
 convertView = mInflater.inflate(R.layout.list_item_icon_text,

 parent, false);

 holder = new ViewHolder();

 holder.text = (TextView) convertView.findViewById(R.id.text);

 holder.icon = (ImageView) convertView.findViewById(R.id.icon);

 convertView.setTag(holder);

} else {
    
    
holder = (ViewHolder) convertView.getTag();

}

holder.text.setText(DATA[position]);

holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}

Supongo que te gusta

Origin blog.csdn.net/weixin_46311652/article/details/114955284
Recomendado
Clasificación