¿Repetición de elementos en ListView?
Todo estaba funcionando bien, pero ahora no estoy recibiendo lo que está sucediendo, tengo 10 elementos para mostrar en el listView, su trabajo bien hasta el sexto elemento y después de que se repite de nuevo desde el primer elemento de nuevo ??
public class GroupDetailsAdapter extends BaseAdapter { List<GetSetGroupDetails> group_details = new ArrayList<GetSetGroupDetails>(); Context context; Typeface face; public GroupDetailsAdapter(List<GetSetGroupDetails> group_details, Context context) { super(); this.group_details.clear(); this.group_details = group_details; this.context = context; face = Typeface.createFromAsset(context.getAssets(), "HelveticaNeueLTStd-Th.otf"); } @Override public int getCount() { // TODO Auto-generated method stub int count = group_details.size(); return count; } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v = convertView; ViewHolder holder; if (v == null) { try { LayoutInflater vi = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.group_item, null); holder = new ViewHolder(); holder.tv_group_name = (TextView) v .findViewById(R.id.tv_group_name); String group_name = group_details.get(position).getGroup_name(); holder.tv_group_name.setText(group_name); holder.tv_group_name.setTypeface(face); holder.tv_group_reg_id = (TextView) v .findViewById(R.id.tv_group_reg_id); String groupRegId = group_details.get(position) .getGroup_reg_id(); holder.tv_group_reg_id.setText(groupRegId); holder.tv_group_reg_id.setTypeface(face); holder.tv_subscriber_count = (TextView) v .findViewById(R.id.tv_subscriber_count); holder.tv_subscriber_count.setText(group_details.get(position) .getSubscriber_count()); v.setTag(holder); } catch (Exception e) { e.printStackTrace(); } } else holder = (ViewHolder) v.getTag(); return v; } class ViewHolder { TextView tv_group_name; TextView tv_group_reg_id; TextView tv_subscriber_count; } }
- cómo clasificar los datos en RecyclerView
- No se puede establecer el margen del elemento en ListView mediante adaptador personalizado
- Cómo dejar OnClick en la función de la llamada de adaptador ListView de la actividad
- Resalte el efecto mientras presiona el elemento en el adaptador ListView personalizado
- Android: Adaptador personalizado con hiladora personalizada desplegable diseño xml que da error
- Los elementos de listView tienen texto en blanco al utilizar setAdapter en el subproceso de interfaz de usuario
- Cómo usar setTag y getTag con un adaptador personalizado
- ¿Adaptador personalizado de HorizontalScrollView?
- Adaptador personalizado para cajón de navegación
- TextView en las filas listview que muestran valores repetidos en desplazamiento en Android?
- Custom ListView donde todas las imágenes tienen el mismo tamaño
- Después de mantener el estado de colapso / expansión para nivel N o Multinivel lista ampliable algunos subgrupos no se muestran
- Selección / resaltado de varios elementos en listview con adaptador personalizado - Android
Usted se enfrenta a ese problema de repetición de datos, solo porque no está siguiendo los estándares exactos de implementación del patrón de View-Holder.
Incorrecto:
Aquí usted está haciendo findViewById () y la configuración de datos si la vista es nula, por lo que se ejecutará bien para el primer conjunto de elementos, posdata que le mostrará los mismos datos para los próximos conjuntos de elementos.
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v = convertView; ViewHolder holder; if (v == null) { try { LayoutInflater vi = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.group_item, null); holder = new ViewHolder(); holder.tv_group_name = (TextView) v .findViewById(R.id.tv_group_name); String group_name = group_details.get(position).getGroup_name(); holder.tv_group_name.setText(group_name); holder.tv_group_name.setTypeface(face); holder.tv_group_reg_id = (TextView) v .findViewById(R.id.tv_group_reg_id); String groupRegId = group_details.get(position) .getGroup_reg_id(); holder.tv_group_reg_id.setText(groupRegId); holder.tv_group_reg_id.setTypeface(face); holder.tv_subscriber_count = (TextView) v .findViewById(R.id.tv_subscriber_count); holder.tv_subscriber_count.setText(group_details.get(position) .getSubscriber_count()); v.setTag(holder); } catch (Exception e) { e.printStackTrace(); } } else holder = (ViewHolder) v.getTag(); return v; }
Correcto:
La forma correcta de implementar el patrón de View Holder es encontrar vistas si la vista actual es null (que ocurriría por primera vez) y establecer datos sólo después de hacerlo. Así que eventualmente findViewById()
proceso se hará por primera vez y la próxima vez en adelante obtendrá vistas mediante el uso de etiquetas adjuntas.
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v = convertView; ViewHolder holder; if (v == null) { LayoutInflater vi = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.group_item, null); holder = new ViewHolder(); holder.tv_group_name = (TextView) v .findViewById(R.id.tv_group_name); holder.tv_group_reg_id = (TextView) v .findViewById(R.id.tv_group_reg_id); holder.tv_subscriber_count = (TextView) v .findViewById(R.id.tv_subscriber_count); v.setTag(holder); } catch (Exception e) { e.printStackTrace(); } } else holder = (ViewHolder) v.getTag(); String group_name = group_details.get(position).getGroup_name(); holder.tv_group_name.setText(group_name); holder.tv_group_name.setTypeface(face); String groupRegId = group_details.get(position) .getGroup_reg_id(); holder.tv_group_reg_id.setText(groupRegId); holder.tv_group_reg_id.setTypeface(face); holder.tv_subscriber_count.setText(group_details.get(position) .getSubscriber_count()); return v; }
Usted puede obtener nullpointerexception .. para deshacerse de este intente este código simple
public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder vh; View v = convertView; if(v == null){ v = LayoutInflater.from(ctx).inflate(R.layout.simple_list_item, parent, false); vh = new ViewHolder(v); v.setTag(vh); } else{ vh = (ViewHolder) v.getTag(); } vh.tvTitle.setText(list.get(position).toString()); return v; } class ViewHolder{ TextView tvTitle; public ViewHolder(View v){ tvTitle = (TextView) v.findViewById(R.id.tvVideoName); }
- Problema de sincronización con el reproductor multimedia Android y el buscador
- InputStream no recibe EOF