¿Cómo puedo agregar imágenes dinámicamente a un GridView?

Tengo un GridView que se crea en función de una serie de elementos. Necesito agregar más imágenes a medida que la cuadrícula se desplaza hacia la parte inferior, pero no estoy seguro de cómo hacerlo.

Ahora entiendo lo siguiente:

  1. Tengo un adaptador que analiza la matriz y proporciona ImageIds a la clase que devolverá el ImageViews
  2. De alguna manera tengo que cambiar esta matriz e informarle al adaptador, así que mi pregunta es, ¿cómo puedo obtener una referencia a este adaptador?

Este es mi codigo:

package com.wm.grid;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.Toast;

public class GridActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Integer[] mThumbIds12 = {
                R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7,
                R.drawable.sample_0, R.drawable.sample_1,
                R.drawable.sample_2, R.drawable.sample_3,
                R.drawable.sample_4, R.drawable.sample_5,
                R.drawable.sample_6, R.drawable.sample_7
    };
    final Integer[] mThumbIds1 = { 
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
            R.drawable.sample_2, R.drawable.sample_3,R.drawable.s1,
    };
    final GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this,mThumbIds12));
    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            Toast.makeText(GridActivity.this, "" + position, Toast.LENGTH_SHORT).show();

        }
    });
    gridview.setOnScrollListener(new OnScrollListener() {
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            switch (scrollState) {
            case OnScrollListener.SCROLL_STATE_IDLE:
                //List is idle
                break;
            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                //Toast.makeText(GridActivity.this, "X", Toast.LENGTH_SHORT).show();
                break;
            case OnScrollListener.SCROLL_STATE_FLING:
                //Toast.makeText(GridActivity.this, "Z", Toast.LENGTH_SHORT).show();
                break;
            }   
        }

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if(firstVisibleItem + visibleItemCount == totalItemCount){
                Toast.makeText(GridActivity.this, "BOTTOM", Toast.LENGTH_SHORT).show();

            }
            //Toast.makeText(GridActivity.this, "TOP", Toast.LENGTH_SHORT).show();  
        }
    });

}
}

Ahora hay un código redundante, pero este es mi proyecto de prueba. Todo lo que sé es que la actualización del adaptador debe realizarse cuando firstVisibleItem + visibleItemCount == totalItemCount (es decir, cuando el GridView ha llegado al fondo).

Este es mi ImageAdapter (basado en el sitio de desarrollo de Android)

package com.wm.grid;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import com.wm.grid.R;

public class ImageAdapter extends BaseAdapter {
   private Context mContext;
   private Integer[] mThumbIds;
    public ImageAdapter(Context c,Integer[] m) {
        mContext = c;
        mThumbIds = m;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(150, 150));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }
    public Integer[] AddItems(Integer[] a){
        final Integer[] aThumbIds;
        final int i;
        aThumbIds = a;
        Integer[] a2 = new Integer[mThumbIds.length + aThumbIds.length];
        System.arraycopy(mThumbIds, 0, a2, 0, mThumbIds.length);
        System.arraycopy(aThumbIds, 0, a2, mThumbIds.length, aThumbIds.length);
        return mThumbIds;
    }
}

image.xml

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/grid_item_image"
      android:layout_width="50dp"
      android:layout_height="50dp"
      android:src="@drawable/s1"
      >
</ImageView>

main.xml

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

<TextView
android:id="@+id/tv1"
android:layout_width="fill_parent"
android:layout_height="40pt"
android:text="row three"
android:textSize="15pt" />

</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<GridView  
android:id="@+id/gridview"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:columnWidth="150dp"
android:numColumns="auto_fit"
android:verticalSpacing="2dp"
android:horizontalSpacing="2dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
</LinearLayout>

¿Cómo debería abordar esto?

preguntado el 08 de noviembre de 11 a las 16:11

2 Respuestas

Puede obtener una referencia al adaptador que respalda GridView mediante .getAdapter (). Cuando el usuario se desplazó hacia abajo, obtenga este adaptador, agregue las nuevas imágenes (creo que debería usar una ArrayList en lugar de matrices simples para que pueda agregar fácilmente más datos en la clase ImageAdapter) y llame a .notifyDatasetChanged () en el adaptador ahora modificado , por lo que cargará los nuevos datos.

respondido 08 nov., 11:20

Hola, gracias por la respuesta. Cuando pruebo el adaptador me encuentro con otro problema. El adaptador que obtengo con getAdapter es un ListAdapter ... y el método NotifyDatasetChanged () requiere un ArrayAdapter ... Estoy realmente confundido. - user1036005

Como sabe que en realidad es un ImageAdapter, simplemente transmítalo. ImageAdapter yourAdapter = (ImageAdapter) yourGrid.getAdapter (). - Zsombor Erdődy-Nagy

Hice esto: `Toast.makeText (GridActivity.this," BOTTOM ", Toast.LENGTH_SHORT) .show (); ImageAdapter ia = (ImageAdapter) gridview.getAdapter (); ia.AddItems (mThumbIds1); ia.notifyDataSetChanged (); gridview.invalidate (); `y el resultado es que la aplicación está funcionando, sin embargo, no se añaden imágenes a la vista de cuadrícula. Solo están los que están cargados con la carga de la aplicación. Qué está mal ? - user1036005

Duuuude Eres un genio. Lo hice. En realidad resultó que fue un error realmente tonto. Ahora que se estrenó, creo un sinfín de vistas de cuadrícula ... GRACIAS. - user1036005

@ user1036005 :: ¿Cómo lograste esto? por favor, ¿pueden ayudarme a crear una vista de cuadrícula sin fin para las imágenes? amistad

Debería poder llamar a getAdapter en la vista de cuadrícula. O, puede que no sea la mejor práctica, pero puede hacer que el adaptador esté estático, lo que le permitiría tener acceso desde su actividad de cuadrícula. Luego, puede agregar imágenes a los adaptadores sobre la marcha y restablecer su diseño.

Darle una oportunidad. Es lo que haría yo. ¡Si encuentra una manera mejor, hágamelo saber!

respondido 08 nov., 11:20

Hola amigo, no puedo usar getAdapter porque devuelve un ListAdapter y no tengo ni idea de qué hacer con él ... (tonto) ¿Alguna sugerencia? - user1036005

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.