2012-01-25 12 views
5

Sto cercando di utilizzare un GridView con un ImageView e un TextView all'interno di ogni cella. Così ho creato il layout della cella, il layout della griglia, l'imageAdapter e l'attività principale, naturalmente, ma continuo ad avere il seguente problema:Problema utilizzando GridView con ImageViews e TextViews

Quando provo questo sull'emulatore, le immagini iniziali e le didascalie sono mostrate correttamente ma appena scorro, alcuni elementi iniziano a rovinare e continuano a cambiare e persino a duplicare alcune volte.

Sto usando 2 array paralleli (immagini e didascalia). Ho provato a utilizzare la funzione Log.v per scoprire quali indici e immagini venivano mostrati quando veniva chiamato getView, ma solo quelli iniziali (che possono essere visualizzati senza scorrimento) sono assegnati correttamente.

Ho dovuto risolvere il problema generando la vista più e più volte, ma ovviamente non è la strada giusta.

Qui ci sono i file che sto usando:

Griglia cellulare:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/GridItem" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:gravity="center_horizontal"> 

    <ImageView android:id="@+id/grid_item_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </ImageView> 

    <TextView android:id="@+id/grid_item_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" 
     android:gravity="center_horizontal" 
     android:textColor="#FFFFFF"> 
    </TextView> 

</LinearLayout> 

GridView:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:gravity="center_vertical" 
     android:text="@string/txtMenu" 
     /> 
    <GridView 
     android:id="@+id/grdMenu" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="50dp" 
     android:gravity="center" 
     android:padding="10dp" 
     android:horizontalSpacing="10dp" 
     android:verticalSpacing="10dp" 
     android:numColumns="3" > 
    </GridView> 

</RelativeLayout> 

GridActivity: (L'unico metodo implementato)

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.menu); 

    GridView gridview = (GridView) findViewById(R.id.grdMenu); 
    gridview.setAdapter(new ImageAdapter(this)); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
      Toast.makeText(getApplicationContext(), "" + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

ImageAdapter:

public class ImageAdapter extends BaseAdapter { 

    private Context mContext; 
    private Integer[] mThumbIds = {R.drawable.potencia32x32,R.drawable.detalle_cuenta32x32,R.drawable.solicitud32x32,R.drawable.agregar32x32,R.drawable.cyr_32x32, 
      R.drawable.usuarios,R.drawable.cambio_med64x64,R.drawable.cobranza_ex64x64,R.drawable.convenio_pagos64x64,R.drawable.copiabf64x64, 
      R.drawable.info_cliente64x64,R.drawable.mant_exp64x64,R.drawable.ordenes64x64,R.drawable.reembolsos64x64,R.drawable.seguro64x64,R.drawable.solicitudes64x64, 
      R.drawable.suministro64x64 

    }; 
    private String[] Caption = {"Consumo","Facturaciones","Solicitudes","Pagos","Cortes y Rcnx","Datos Generales","Cambios de Medidores","Cobranza Externa","Convenio Pagos","Copia Fac. o Bol.", 
      "Info. Cliente","Mant. Expediente","Consulta Ordenes","Historia Reembolsos","Seguros","Solicitudes","Caracteristicas Suministro" 

    }; 
    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

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

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

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


    public View getView(int position, View convertView, ViewGroup parent) { 


     View myView = null; 

     if(convertView==null) 
     { 
      LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      myView = li.inflate(R.layout.grdmenu_cell, null); 

      TextView tv = (TextView) myView.findViewById(R.id.grid_item_text); 
      Log.v("D:<",String.valueOf(Caption.length) +" y: "+ String.valueOf(position)); 
      tv.setText(Caption[position]); 


      ImageView iv = (ImageView) myView.findViewById(R.id.grid_item_image); 
      Log.v("D:<",String.valueOf(mThumbIds.length) +" y: "+ String.valueOf(position)); 
      iv.setImageResource(mThumbIds[position]); 
     } 
     else 
     { 
      myView = convertView; 
     } 

     return myView; 
    } 

} 

Questa è la mia prima domanda quindi se ho commesso degli errori, per favore dimmi. Grazie in anticipo.

risposta

4

Penso che l'errore sia nel tuo getView del tuo Adattatore. ConvertView non manterrà le risorse a cui si accede tramite findViewById() e quant'altro, solo la visualizzazione gonfiata. Prova a cambiarlo con qualcosa di simile:

public View getView(int position, View convertView, ViewGroup parent) { 


    View myView = null; 

    if(convertView==null) 
    { 
     LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     myView = li.inflate(R.layout.grdmenu_cell, null); 
    }else{ 
     myView = convertView; 
    } 


    TextView tv = (TextView) myView.findViewById(R.id.grid_item_text); 
    Log.v("D:<",String.valueOf(Caption.length) +" y: "+ String.valueOf(position)); 
    tv.setText(Caption[position]); 

    ImageView iv = (ImageView) myView.findViewById(R.id.grid_item_image); 
    Log.v("D:<",String.valueOf(mThumbIds.length) +" y: "+ String.valueOf(position)); 
    iv.setImageResource(mThumbIds[position]); 

    return myView; 

}

+0

Che ha fatto il trucco. Molte grazie. –

+0

nessun problema. Volare e accettare se ha funzionato per te. – SeanPONeil

+0

Can not Upvote, richiede 15 reputazione. Mi dispiace. –

Problemi correlati