¿Cómo funciona CursorAdapter en android en GridView?

Tengo un problema con usar el adaptador del cursor en gridview que utilicé el cursor para cargar las fotos del almacén de los medios. Me di cuenta de mi nuevoView y bindView se llamó por completo. Quiero decir asumiendo que tengo 500 fotos, el newView también se llama el mismo número de veces.

Hice algo mal ? Pensé que sólo se llama cuando la celda era visible en la pantalla.

public int taskA = 0; public GalleryCursorAdapter(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub } @Override public void bindView(View view, Context context, Cursor cursor) { // TODO Auto-generated method stub int index = cursor.getColumnIndex(MediaStore.Images.Media._ID); long id = cursor.getLong(index); Bundle idBundle = new Bundle(); idBundle.putLong("id", id); Message msg = new Message(); msg.setData(idBundle); ImageHandler imgHandler = new ImageHandler(context, (ImageView) view); imgHandler.sendMessage(msg); view.setTag(imgHandler); Log.w("task s", " count"); } @SuppressLint({ "NewApi", "NewApi" }) @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { // TODO Auto-generated method stub int index = cursor.getColumnIndex(MediaStore.Images.Media._ID); long id = cursor.getLong(index); ImageView iView = new ImageView(context); Bundle idBundle = new Bundle(); idBundle.putLong("id", id); Message msg = new Message(); msg.setData(idBundle); ImageHandler imgHandler = new ImageHandler(context, iView); imgHandler.sendMessage(msg); iView.setTag(imgHandler); taskA++; Log.w("task s", taskA+ " count"); return iView; } static class ImageHandler extends Handler { private ImageView mView; private Context mContext; public ImageHandler(Context c, ImageView v) { mView = v; mContext = c; } @Override public void handleMessage(Message msg) { Bundle idBundle = msg.getData(); Long id = idBundle.getLong("id"); Bitmap image = MediaStore.Images.Thumbnails.getThumbnail( mContext.getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, new Options()); mView.setImageBitmap(image); } } 

 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ImageView iView = new ImageView(context); iView.setLayoutParams(new GridView.LayoutParams(200, 200)); taskA++; Log.w("task s", taskA+ " count"); return iView; } 

Nota, he eliminado todo el código que no se supone que está en newView (debe estar en bindView) reemplazar new GridView.LayoutParams(200, 200) con cualquier altura / ancho que necesita, no utilizar el contenido de ajuste como su contenido Está vacío al principio, dando como resultado 0x0 píxeles, de manera que TODOS los ImageViews de tu cursor encajan en el GridView a la vez (así newView y bindView se llaman para cada vista)

Simplemente extendería BaseAdapter en lugar de Cursor Adapter y pasaría los datos recuperados al adaptador con una devolución de llamada. Todavía no está usando ningún tipo de hilo diferente para el getThumbnail – el manejador se ejecuta en el hilo principal y es sólo para actualizar la interfaz de usuario normalmente.

También debe trabajar con ViewHolders y el convertView para acelerar la velocidad de la cuadrícula.

Tengo algo como esto como BaseAdapter para cada adaptador:

 public abstract class MyBaseAdapter extends BaseAdapter { protected LayoutInflater inflater; protected Context context; public TikBaseAdapter(Context context) { this.context = context; this.inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public final View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); if (convertView == null) { convertView = newView(type, parent); } bindView(position, type, convertView); return convertView; } /** Create a new instance of a view for the specified {@code type}. */ public abstract View newView(int type, ViewGroup parent); /** Bind the data for the specified {@code position} to the {@code view}. */ public abstract void bindView(int position, int type, View view); } 

Mi auténtico Adaptador reemplaza getItemViewType y luego usa mayúsculas para inflar el diseño correcto y funciona con viewHolders (view.setTag ()) para acelerar el rendimiento de desplazamiento. Sólo use view.getTag () en el método bindView y luego edite View-Items.

Por lo que entendí, es necesario vincular los datos a la vista que ha creado. Me gusta esto:

 public class ExampleCursorAdapter extends CursorAdapter { public ExampleCursorAdapter(Context context, Cursor c) { super(context, c); } @Override public void bindView(View view, Context context, Cursor cursor) { TextView summary = (TextView)view.findViewById(R.id.summary); summary.setText(cursor.getString( cursor.getColumnIndex(ExampleDB.KEY_EXAMPLE_SUMMARY))); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.item, parent, false); bindView(v, context, cursor); return v; } } 
  • La miniatura no se actualiza inmediatamente
  • Obtener todas las fotos de la programación android de dispositivos Android
  • Mediastore para Android: ¿Cómo recuperar de forma eficiente todas las canciones de un determinado género?
  • Android - Selector de imágenes no funciona en Kindle Fire?
  • Cómo limitar la duración de MediaStore en Android 7
  • Cómo obtener datos de MediaStore.File y MediaStore.File.FileColumn
  • ¿Cómo puedo actualizar MediaStore en Android?
  • Uso del URI de contenido con ACTION_VIDEO_CAPTURE
  • Listar todas las imágenes de la cámara en Android
  • MediaStore - Uri para consultar todos los tipos de archivos (medios y no medios)
  • Android MediaScanner: elimina los archivos de imagen de la galería
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.