¿Cómo implementar un titular de vista?
Estoy utilizando un espectador para mostrar desde un arrayadapter.it dinámico funciona, pero los datos que se muestran cambian de forma irregular cuando desplazo la lista. Quiero que mi vista de lista se llene sólo una vez, no todo el tiempo cuando desplazo mi lista. ¿Cualquier sugerencia? Aquí está mi código
public View getView(int position, View convertView, ViewGroup parent) { // A ViewHolder keeps references to children views to avoid unneccessary calls // to findViewById() on each row. ViewHolder holder; // When convertView is not null, we can reuse it directly, there is no need // to reinflate it. We only inflate a new View when the convertView supplied // by ListView is null. if (convertView == null) { convertView = mInflater.inflate(R.layout.sample, null); // Creates a ViewHolder and store references to the two children views // we want to bind data to. holder = new ViewHolder(); holder.name = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. if(_first==true) { if(id<myElements.size()) { holder.name.setText(myElements.get(id)); holder.icon.setImageBitmap( mIcon1 ); id++; } else { _first=false; } } //holder.icon.setImageBitmap(mIcon2); /*try{ if(id<myElements.size()) id++; else { id--; } } catch(Exception e) { android.util.Log.i("callRestService",e.getMessage()); }*/ return convertView; } static class ViewHolder { TextView name; ImageView icon; }
Cuando se carga la lista se ve así: http://i.stack.imgur.com/NrGhR.png Después de desplazar algunos datos http://i.stack.imgur.com/sMbAD.png Parece que esto, y de nuevo si me desplácese hasta el principio se ve http://i.stack.imgur.com/0KjMa.png
- Android: Tutorial sobre la creación de vistas personalizadas
- OnSuggestionClick recrea mi actividad
- El cajón de navegación es lento con vista compleja
- View.getDrawingCache () sólo funciona una vez
- Android VideoView - Detecta el punto del tiempo en el video
PS: mi lista tiene que estar en orden alfabético
- Cómo configurar el color de fondo de una vista
- Tamaño del artículo de menú personalizado y tamaño de texto en la vista de navegación
- onTouchListener anula un fondo personalizado en la vista de botón?
- ¿Cómo puedo obtener OnBackPressed () mientras SearchView está activado?
- Diseño de animación Android
- SearchView gana el foco y abre el teclado cuando regresa de otra actividad
- ¿Cómo puedo recuperar el botón de trabajo cuando searchview en Android
- Uso de Javascript en la vista web
Usted tendría que escribir su propia versión de ListView
para hacer eso (que es malo). Si el ListView
no funciona correctamente, probablemente significa que está haciendo algo malo.
¿De dónde proviene el elemento id
? Usted está obteniendo la posición en su método getView()
, por lo que no necesita preocuparse por exceder los límites de la lista. La posición está vinculada a la posición del elemento en su lista, por lo que puede obtener el elemento correcto como este:
myElements.get(position);
Cuando cambia los datos de su lista, puede llamar a esto:
yourAdapter.notifyDataSetChanged()
Que va a reconstruir su lista con nuevos datos (mientras mantiene su desplazamiento y cosas).
¿Has probado esto?
public View getView(int position, View convertView, ViewGroup parent) { // A ViewHolder keeps references to children views to avoid unneccessary calls // to findViewById() on each row. ViewHolder holder; // When convertView is not null, we can reuse it directly, there is no need // to reinflate it. We only inflate a new View when the convertView supplied // by ListView is null. if (convertView == null) { convertView = mInflater.inflate(R.layout.sample, null); // Creates a ViewHolder and store references to the two children views // we want to bind data to. holder = new ViewHolder(); holder.name = (TextView) convertView.findViewById(R.id.text); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } // Bind the data efficiently with the holder. holder.name.setText(myElements.get(id)); holder.icon.setImageBitmap( mIcon1 ); return convertView; } static class ViewHolder { TextView name; ImageView icon; }
Si es así, ¿qué tiene de malo?
No creo que cargar todas las filas a la vez es una buena idea. Usted terminará para arriba tener un montón de vistas inútiles en la memoria que van a retardar la aplicación abajo para nada. Las vistas y las operaciones en las vistas (como inflar, findViewById, getChild ..) son costosas, usted debe intentar reutilizarlas tanto como sea posible. Es por eso que utilizamos ViewHolders.
- Utilizar ListView o GridView dinámicamente en función del diseño utilizado por dispositivo
- Cómo terminar todas las actividades y cerrar la aplicación en android?