El método getView () de ArrayAdapter repite dos o tres elementos en la lista

ArrayAdapter un ArrayAdapter con un método getView() sobrescrito para llenar mi objeto ListView , pero el adaptador tomará los primeros dos o tres objetos de la ArrayList que paso a ella, luego sólo repita los de orden aparentemente aleatorio para toda la longitud de la lista. Además, cuando se desplaza hacia arriba y hacia abajo en el ListView , algunas filas cambian de un elemento de lista a otro. El objeto ArrayList<Credit> se rellena desde un JSONObject y, según mi conocimiento, es correcto antes de pasarlo al ArrayAdapter .

Mi ArrayAdapter personalizado

 private class CreditArrayAdapter extends ArrayAdapter<Credit> { private ArrayList<Credit> credits; private int creditCount; public CreditArrayAdapter(Context ctx, int textViewResourceId, List<Credit> items) { super(ctx, textViewResourceId, items); credits = (ArrayList<Credit>) items; creditCount = credits.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_item_movie_medium, null); Credit current = credits.get(position); Log.d(tag, "current credit: " + current.toString()); ImageView creditPicture = (ImageView) v.findViewById(R.id.image_poster_thumbnail); try { creditPicture.setImageBitmap(current.getPosterSmall()); } catch(Exception e) { Log.d(tag, "failed to set cast member picture"); e.printStackTrace(); } TextView castMemberName = (TextView) v.findViewById(R.id.text_credit_info); castMemberName.setText(current.toString()); } return v; } @Override public int getCount() { return creditCount; } } 

Siendo llamado por:

 appearsIn = (ListView) findViewById(R.id.listview_appears_in); List<Credit> credits = searcher.getCreditsByPersonId(personId); CreditArrayAdapter creditAdapter = new CreditArrayAdapter(getBaseContext(), R.layout.list_item_movie_medium, credits); creditAdapter.notifyDataSetChanged(); appearsIn.setAdapter(creditAdapter); 

El diseño que contiene ListView :

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerHorizontal="true" android:weightSum="2"> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/image_person_info" android:layout_height="wrap_content" android:layout_width="wrap_content" android:contentDescription="person image"/> <TextView android:id="@+id/text_person_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30dp"/> <TextView android:id="@+id/text_person_birth" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> <TextView android:id="@+id/text_person_death" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp"/> <TextView android:id="@+id/text_person_bio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp"/> </LinearLayout> </ScrollView> <ListView android:id="@+id/listview_appears_in" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"/> </LinearLayout> 

Mi diseño de elemento de lista:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <ImageView android:id="@+id/image_poster_thumbnail" android:layout_height="wrap_content" android:layout_width="wrap_content"/> <TextView android:id="@+id/text_credit_info" android:layout_height="wrap_content" android:layout_width="fill_parent"/> </LinearLayout> 

Cambiar el getView como este:

 public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_item_movie_medium, null); } Credit current = credits.get(position); Log.d(tag, "current credit: " + current.toString()); ImageView creditPicture = (ImageView) v.findViewById(R.id.image_poster_thumbnail); try { creditPicture.setImageBitmap(current.getPosterSmall()); } catch(Exception e) { Log.d(tag, "failed to set cast member picture"); e.printStackTrace(); } TextView castMemberName = (TextView) v.findViewById(R.id.text_credit_info); castMemberName.setText(current.toString()); return v; } 

Su problema era que no estaba haciendo todo el código que necesitaba para establecer el objeto Ver correctamente cuando convertView era! = Null.

Utilice este fragmento:

  @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_item_movie_medium, null); } Credit current = credits.get(position); Log.d(tag, "current credit: " + current.toString()); ImageView creditPicture = (ImageView) v.findViewById(R.id.image_poster_thumbnail); try { creditPicture.setImageBitmap(current.getPosterSmall()); } catch(Exception e) { Log.d(tag, "failed to set cast member picture"); e.printStackTrace(); } TextView castMemberName = (TextView) v.findViewById(R.id.text_credit_info); castMemberName.setText(current.toString()); return v; } 

Trate de ajustar su diseño xml en cualquier lugar que haga referencia a la altura, porque el androide hará una medida para dibujar cada vez y volverá a dibujar la celda de nuevo. Intente utilizar en listview match_parent y en celda en la fila una altura exacta. perdón mi Inglés es malo.

  • Android convertView, para usarlo o no?
  • Cómo agregar un pie de página en ListView?
  • ¿Puedo hacer que un elemento ListView no sea seleccionable?
  • ¿Cómo evito que listview se desplace a la parte superior después de usar setAdapter?
  • Android ListView no se actualiza por Filtro
  • Cerrado o circular Horizontal ListView Android
  • Agregar margen encima del elemento ListView superior (y inferior al último) en Android
  • Desactivar desplazamiento de Android y hacer clic para listview
  • Filtro de búsqueda de Android para la vista de lista
  • ¿Cómo animar el cambio de texto en TextView?
  • ListView de WebViews: falla la reutilización de elementos de altura diferente; Solicita todas las vistas antes de mostrar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.