ConvertView se pasa como null incluso si la vista existe

He desarrollado una aplicación de Android donde la imagen y el texto se muestran en una vista de cuadrícula y cuando el usuario desplaza los próximos diez elementos (imagen y texto) se muestran. El problema surge cuando se llama al método getView de adaptador después de llamar a adapter.notifyDataSetChanged (). El adaptador recicla los datos pero las posiciones se reordenan y se repiten en vista de cuadrícula. No había hecho frente a este problema hasta que agregué la condición para comprobar si convertView es null.

Clase de actividad:

public class DynamicListViewActivity extends Activity implements OnScrollListener { int visibleElements; int scrollState; int count; TextAdapter adapter = new TextAdapter(); int total=200;// total items limit in grid view @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.grid); count=10; GridView grid = (GridView) findViewById(R.id.gridview); grid.setAdapter(adapter); grid.setOnScrollListener(this); } public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) { visibleElements= visibleCount; } public void onScrollStateChanged(AbsListView v, int s) { Log.d("ScrollState", s+""); scrollState=s; isScrollStateComplete(); } public void isScrollStateComplete(){ if(visibleElements>0 && scrollState==SCROLL_STATE_IDLE && total>count){ int diff=total-count; count+=(diff>=10)?10:diff;//update count to next ten items adapter.notifyDataSetChanged(); } } class TextAdapter extends BaseAdapter { public int getCount() { return count; } public Object getItem(int pos) { return pos; } public long getItemId(int pos) { return pos; } public View getView(int pos, View convertView, ViewGroup p) { View v = convertView; System.out.println("pos : "+pos+" boolean "+(v==null));// log to check position and convertView if(v==null){ v =((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.textlayout,null); ImageView iv = (ImageView) v.findViewById(R.id.album_thumbnail); iv.setImageDrawable(getResources().getDrawable(R.drawable.icon)); TextView tvAlbumName = (TextView)v.findViewById(R.id.album_name); tvAlbumName.setText("postion "+pos); TextView tvAlbumDesc = (TextView)v.findViewById(R.id.album_description); tvAlbumDesc.setText(""); } return v; } } } 

Antes de que la vista de cuadrícula de desplazamiento se muestre correctamente. Iniciar sesión :

 08-05 14:24:34.440: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.mis.list.demo/.DynamicListViewActivity } 08-05 14:24:34.642: INFO/System.out(685): pos : 0 boolean true 08-05 14:24:34.710: INFO/System.out(685): pos : 0 boolean false 08-05 14:24:34.710: INFO/System.out(685): pos : 1 boolean true 08-05 14:24:34.730: INFO/System.out(685): pos : 2 boolean true 08-05 14:24:34.800: INFO/System.out(685): pos : 3 boolean true 08-05 14:24:34.860: INFO/System.out(685): pos : 4 boolean true 08-05 14:24:34.880: INFO/System.out(685): pos : 5 boolean true 08-05 14:24:34.910: INFO/System.out(685): pos : 6 boolean true 08-05 14:24:34.920: INFO/System.out(685): pos : 7 boolean true 08-05 14:24:34.960: INFO/System.out(685): pos : 0 boolean true 08-05 14:24:35.030: INFO/ActivityManager(58): Displayed activity com.mis.list.demo/.DynamicListViewActivity: 520 ms (total 520 ms) 

Después del primer extremo del desplazamiento

 08-05 14:26:15.740: DEBUG/ScrollState(685): 1 08-05 14:26:15.830: DEBUG/dalvikvm(685): GC_EXTERNAL_ALLOC freed 3624 objects / 257464 bytes in 71ms 08-05 14:26:16.210: INFO/System.out(685): pos : 8 boolean false 08-05 14:26:16.210: INFO/System.out(685): pos : 9 boolean true 08-05 14:26:16.250: DEBUG/ScrollState(685): 0 08-05 14:26:16.260: INFO/System.out(685): pos : 0 boolean true 08-05 14:26:16.271: INFO/System.out(685): pos : 0 boolean false 08-05 14:26:16.271: INFO/System.out(685): pos : 1 boolean false 08-05 14:26:16.271: INFO/System.out(685): pos : 2 boolean false 08-05 14:26:16.271: INFO/System.out(685): pos : 3 boolean false 08-05 14:26:16.271: INFO/System.out(685): pos : 4 boolean false 08-05 14:26:16.271: INFO/System.out(685): pos : 5 boolean false 08-05 14:26:16.280: INFO/System.out(685): pos : 6 boolean false 08-05 14:26:16.280: INFO/System.out(685): pos : 7 boolean false 08-05 14:26:16.280: INFO/System.out(685): pos : 8 boolean false 08-05 14:26:16.280: INFO/System.out(685): pos : 9 boolean false 08-05 14:26:16.280: INFO/System.out(685): pos : 10 boolean false 08-05 14:26:16.280: INFO/System.out(685): pos : 11 boolean true 08-05 14:26:16.371: DEBUG/dalvikvm(685): GC_EXTERNAL_ALLOC freed 644 objects / 33224 bytes in 41ms 08-05 14:26:45.270: WARN/KeyCharacterMap(685): No keyboard for id 0 08-05 14:26:45.270: WARN/KeyCharacterMap(685): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 08-05 14:26:45.341: INFO/System.out(685): pos : 12 boolean true 08-05 14:26:45.351: INFO/System.out(685): pos : 13 boolean true 08-05 14:26:45.371: INFO/System.out(685): pos : 14 boolean true 08-05 14:26:45.380: INFO/System.out(685): pos : 15 boolean true 08-05 14:26:45.450: INFO/System.out(685): pos : 16 boolean false 08-05 14:26:45.450: INFO/System.out(685): pos : 17 boolean false 08-05 14:26:45.460: INFO/System.out(685): pos : 18 boolean false 08-05 14:26:45.460: INFO/System.out(685): pos : 19 boolean false 

Pero la cuadrícula se muestra con valores repetidos y no en el orden que debería. Lo siento no se me permite publicar imágenes como soy nuevo usuario.

En el registro veo que para la posición 0 convertView == null es true.

Cómo establecer este derecho como pienso descargar imágenes en el lugar del icono de Android para ver la imagen que se utiliza actualmente.

Por favor ayuda.

Su interpretación de convertView es incorrecta.

 public View getView(int pos, View convertView, ViewGroup p) { View v = convertView; //If convertView is null create a new view, else use convert view if(v==null) v =((LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.textlayout,null); ImageView iv = (ImageView) v.findViewById(R.id.album_thumbnail); iv.setImageDrawable(getResources().getDrawable(R.drawable.icon)); TextView tvAlbumName = (TextView)v.findViewById(R.id.album_name); tvAlbumName.setText("postion "+pos); TextView tvAlbumDesc = (TextView)v.findViewById(R.id.album_description); tvAlbumDesc.setText(""); return v; } 

Es lo que deberías estar haciendo.

Como resultado de lo que estaba haciendo, en los casos en que convertView no era nulo, que acaba de regresar convertView sin actualizar sus datos, y por lo tanto, sus imágenes se repitieron. Solamente en los casos en que convertView era nulo usted fijaba sus datos.

Contrato entre el adaptador y el sistema de vista de lista: Si el convertView es nulo, cree uno nuevo, o vuelva a usarlo.

Vikram Bodicherla es correcta (+1), su implementación es incorrecta, y su muestra de código corrige correctamente su problema. Sin embargo, quiero recomendar la siguiente charla de Google I / O 2010: El mundo de ListView . Es de una hora de duración, pero usted tendrá una comprensión mucho más profunda de cómo funciona el ListView y cómo debe escribir su adaptador para cooperar correctamente con él.

Si Android determina que una vista que representa una fila ya no es visible, permite que el método getView () lo vuelva a usar a través del parámetro convertView.

Un adaptador optimizado para el rendimiento asigna los nuevos datos al convertidor. Esto evita inflar un archivo XML y crear nuevos objetos Java.

En caso de que no haya ninguna vista disponible para su reutilización, Android pasará a null al parámetro convertView. Por lo tanto, la implementación del adaptador necesita comprobar esto.

  • Android: cómo crear GridView
  • Recogida de basura GridView de Android (GC_EXTERNAL_ALLOC) <1K excesivamente, causando una interfaz de usuario muy intermitente
  • Cómo establecer el elemento de vista de cuadrícula según lo seleccionado
  • Android: Cargando elementos de GridView fuera de la pantalla
  • Cómo crear AsymmetricGridView con diferentes tamaños de imagen en fila
  • Android GridView con separador
  • Adición dinámica de elementos de cuadrícula en vista de cuadrícula
  • Establecer determinado elemento en la vista de cuadrícula que no se puede hacer clic
  • NotifyDataSetChanged () no funciona con mi adaptador para gridview
  • LayoutManager para RecyclerView Grid con diferente ancho de celda
  • Soluciones para GridView.scrollTo ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.