2012-01-25 31 views
5

我想在每個單元格內使用帶有ImageView和TextView的GridView。所以我創建了單元格佈局,網格佈局,imageAdapter和主要活動,當然,但我不斷收到以下問題:使用GridView與ImageViews和TextViews問題

當我在模擬器上嘗試此操作時,初始圖像和標題顯示正確,但只要我向下滾動,一些項目開始混亂,並不斷變化,甚至有時重複。

我正在使用2個並行數組(圖像和標題)。我嘗試使用Log.v函數來查找在調用getView時顯示哪些索引和圖像,但只有最初的那些(可以看到沒有滾動)被正確指定。

我必須通過反覆生成視圖來解決問題,但這顯然不是正確的方法。

下面是我使用的文件:

網格單元格:

<?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:(唯一的實現方法)

@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; 
    } 

} 

這是我第一個問題,所以如果我犯了什麼錯誤,請告訴我。提前致謝。

回答

4

我認爲錯誤是在您的適配器getView中。 ConvertView不會保留通過findViewById()訪問的資源,不會影響只有虛增的視圖。嘗試將其更改爲這樣的事情:

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

該訣竅。非常感謝。 –

+0

沒問題。 Upvote並接受,如果它爲你解決。 – SeanPONeil

+0

不能Upvote,需要15點聲望。對不起。 –