Clase de uso adecuado de BaseAdapter específicamente del método GetView -- android campo con performance campo con listview campo con gridview camp Relacionados El problema

Appropriate use BaseAdapter class specifically getView method


0
vote

problema

Español

Hasta ahora he visto varios ejemplos de aplicaciones que usan BaseAdapter y ArrayAdapter<?> . Pero todavía no estoy completamente claro las razones por las que debería ser así.

El primer ejemplo se extiende desde ArrayAdapter<?> , este ejemplo se usa en ListView, el siguiente es el método GetView

  @override public View getView(int position, View convertView, ViewGroup parent) {      View row = convertView;     Holder holder = null;      // Holder represents the elements of the view to use     // Here are initialized        if(null == row) {                        row = LayoutInflater.from(mContext).inflate(LAYOUT_ITEM_ID, parent, false);                          holder = new Holder();         holder.titleTextView = (TextView)row.findViewById(android.R.id.title);                      row.setTag(holder);     } else {         holder = (Holder) row.getTag();     }             // here do operations in holder variable example     holder.titleTextView.setText("Title " + position);      return row; }  public static class Holder {             TextView titleTextView;      }   

Ahora, en un segundo ejemplo, se usa second.jsp0 en un GridView Este es el método GetView

  second.jsp111  

Mi pregunta es: para un uso adecuado de un adaptador es necesario usar una clase estática de "soporte", qué implicaciones tiene esto en el rendimiento de la aplicación y la compatibilidad de las aplicaciones en múltiples dispositivos (Min API 8).

Original en ingles

So far I have seen several examples of applications that use BaseAdapter and ArrayAdapter<?>. but I am still not completely clear the reasons why should be that way.

The first example is extending from ArrayAdapter<?>, this example is used in ListView, the following is the getView method

@override public View getView(int position, View convertView, ViewGroup parent) {      View row = convertView;     Holder holder = null;      // Holder represents the elements of the view to use     // Here are initialized        if(null == row) {                        row = LayoutInflater.from(mContext).inflate(LAYOUT_ITEM_ID, parent, false);                          holder = new Holder();         holder.titleTextView = (TextView)row.findViewById(android.R.id.title);                      row.setTag(holder);     } else {         holder = (Holder) row.getTag();     }             // here do operations in holder variable example     holder.titleTextView.setText("Title " + position);      return row; }  public static class Holder {             TextView titleTextView;      } 

now in a second example a found is used BaseAdapter on a GridView this is the getView method

// create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) {     ImageView imageView;     if (convertView == null) {  // if it's not recycled, initialize some attributes         imageView = new ImageView(mContext);         imageView.setLayoutParams(new GridView.LayoutParams(85, 85));         imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);         imageView.setPadding(8, 8, 8, 8);     } else {         imageView = (ImageView) convertView;     }      imageView.setImageResource(mThumbIds[position]);      return imageView; } 

My question is: for a proper use of an Adapter is necessary to use a "Holder" static class, what implications does this have on application performance and compatibility on multiple devices (min API 8).

           

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

No es necesario usar una clase de titular; Es más importante asegurarse de que reutilice la visualización siempre que sea posible, ya que esto tiene una mejora de velocidad notable. Dicho esto, el uso de un titular ofrece un rendimiento aún mejor, especialmente si está mostrando muchos elementos, ya que GetView no tendrá que inflar el XML cada vez.

Este video explica esto con mayor detalle: http://www.youtube.com/watch? v = wdbm6wveo70

 

It's not necessary to use a holder class; it's more important to make sure that you re-use convertView whenever possible as this has a noticeable speed improvement. That being said, using a holder does offer even better performance, especially if you are displaying a lot of items, as getView won't have to inflate the xml every time.

This video explains this in greater detail: http://www.youtube.com/watch?v=wDBM6wVEO70

 
 
   
   
1
 
vote

primero, me gustaría señalarlo al World of ListView Session que se llevó a cabo durante Google I / O '10. Vale la pena ver esa presentación (o leer a través del PDF) para comprender mejor la mecánica ListView y por qué un patrón de 'Viewhermeder / Rowwrapper' puede acelerar significativamente las cosas.

Hay básicamente dos ingredientes clave para optimizar el getView() lógica:

  • Hacer uso de vistas recicladas (el convertView Parámetros que se transmiten en getView() )
  • Minimice el número de (caro) findViewById() Llamadas

En su primer ejemplo, el patrón de Viewhersholder se aplica solo para inflar la vista de fila si no hay una vista reciclada disponible, eso es bueno. En segundo lugar, reduce la cantidad de búsquedas de vistas etiquetando la fila con un objeto Viewhermeder, que actúa como una envoltura para el TextView que ya se recuperó anteriormente.

Su segundo ejemplo no se infla una vista de fila, sino que lo indiva en tiempo de ejecución. Todavía comprueba si una vista reciclada está disponible y utiliza eso, si es posible, nuevamente, eso es bueno. Además, dado que la vista de fila (o la vista de cuadrícula en este caso) es solo un solo ImageView6 , el 9988777667 puede ser simple a un ImageView . Tenga en cuenta que si la vista de la fila / cuadrícula hubiera consistido en más que solo una simple vista , el enfoque de Viewhersholder desde el primer fragmento sería la forma adecuada de ir.

Dicho esto, dado que la vista de la fila en el primer fragmento también es solo un solo ImageView9 , podría simplificarse utilizando el mismo enfoque de Casting-ConvertView que en el segundo fragmento. Sin embargo, con bastante frecuencia las vistas de las filas consistirán en múltiples vistas, por lo que sugeriría usar siempre el patrón de Viewhersholder, ya que eso le dará la mayor flexibilidad para adaptarse a los cambios futuros.

 

First, I'd like to point you to the World of ListView session that was held during Google I/O '10. It'll be worth watching that presentation (or read through the pdf) to better understand the ListView mechanics and why a 'ViewHolder/RowWrapper' pattern can significantly speed things up.

There are basically two key ingredients to optimizing the getView() logic:

  • Make use of recycled views (the convertView parameters that gets passed into getView())
  • Minimize the number of (expensive) findViewById() calls

In your first example, the ViewHolder pattern is applied to only inflate the row view if no recycled view is available - that's good. Secondly, it reduces the number of view lookups by tagging the row with a ViewHolder object, which acts as a wrapper for the TextView that was already retrieved earlier.

Your second example does not inflate a row view, but rather instantiates it at runtime. It still checks whether a recycled view is available and uses that if possible - again, that's good. Also, since the row view (or grid view in this case) is just a single ImageView, the convertView can simple be cast to an ImageView. Note that if the row/grid view would've consisted of more than just a single view, the ViewHolder approach from the first snippet would be the appropriate way to go.

That being said, since the row view in the first snippet is also just a single TextView, it could potentially be simplified using the same casting-convertView-approach as in the second snippet. Quite often row views will consist of multiple views though, so I'd suggest to always use the ViewHolder pattern, as that will give you most flexibility to accommodate future changes.

 
 

Relacionados problema

11  ¿Cómo congelar el encabezado de GridView?  ( How to freeze gridview header ) 
Como en un título, ¿Alguien sabe cómo congelar el encabezado de GridView en ASP.NET? ...

19  Columnas de dos tablas de base de datos relacionadas en un ASP.NET GridView con EntityDataSource  ( Columns of two related database tables in one asp net gridview with entitydataso ) 
Tengo dos tablas de SQL Server con teclas primarias (PK) y una clave externa (FK) que une las dos tablas: 1) Table "Order" OrderID, int, PK AddressID, i...

3  ASP.NET Eventos que no disparan en la página que contiene un gran control GridView  ( Asp net events not firing in page containing large gridview control ) 
Tengo un control de cuadrícula en una página de ASP, que he límite a una fuente de datos grande (ISH) (aproximadamente 10K filas, con 24 columnas VarChar (50)...

1  ¿Cómo mostrar la tabla / cuadrícula estática en UWP sin usar los elementos?  ( How to display static table grid in uwp without using itemsource ) 
Para mi proyecto, quiero mostrar una cuadrícula / tabla con 3 filas que tienen 4 columnas en cada fila en la solicitud UWP. Todas las columnas tendrán un cont...

2  ASP.NET GridView, cómo activar el modo de edición en función de la ID (Datasky)  ( Asp net gridview how to activate edit mode based on id datakey ) 
Tengo una página, le permita la llamada SourceCetypes.aspx, que tiene un GridView que muestra una lista de tipos de origen. Parte del GridView es un DIATOKEY,...

1  Cómo mostrar la duración SOLO HORAS: MINUTOS: SEGUNDO EN GRIDVIEW ASP.NET usando LINQ a SQL?  ( How to display duration only hoursminutessecond in gridview asp net by using l ) 
Quiero mostrar la duración de la hora de la hora, los minutos y el segundo en Data GridView al restar tiempo de tiempo desde Timecheckin en ASP.NET utilizando...

2  Por un total de un GridView en ASP.NET  ( Totaling a gridview in asp net ) 
En una de mis aplicaciones web de ASP.NET, estoy usando una bulkeditgridview (un GridView que permite editarse todas las filas al mismo tiempo) para impleme...

0  Control de GridView ASP.NET de código abierto / abierto  ( Free open source asp net gridview control ) 
¿Alguien sabe dónde puedo encontrar algunos controles bonitos de GridView para ASP.NET? Estoy realmente tratando de evitar el uso de las redes estándar. Cualq...

0  FilenotFoundException para buscar imagen de SDCard  ( Filenotfoundexception for fetching image from sdcard ) 
Estoy tratando de buscar todas las imágenes en SDCard y rellenar en GridView ,,, Este es mi código, por buscar imagen FRON SDCARD private ArrayList<Custo...

0  LinkButton Postback-URL cambia después de la segunda hora de clasificación / paginación  ( Linkbutton postback url changes after second time of sorting paging ) 
Tengo una página de ASP.NET que ha sido reescrita URL y cuando estoy clasificando mi GridView o la paginación a través de mi buscapersonas personalizadas func...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos