2012-01-25 15 views
5

Próbuję użyć GridView z ImageView i TextView wewnątrz każdej komórki. Tak więc utworzyłem układ komórki, układ siatki, element imageAdapter i główną aktywność, ale nadal pojawia się następujący problem:Problem z używaniem GridView z ImageViews i widokami tekstowymi

Kiedy próbuję tego na emulatorze, początkowe obrazy i podpisy są wyświetlane poprawnie, ale jak tylko przewińę w dół, kilka przedmiotów zaczyna się zepsuć i ciągle się zmienia, a nawet powtarza.

Używam 2 równoległych tablic (obrazów i podpisów). Próbowałem użyć funkcji Log.v, aby dowiedzieć się, które indeksy i obrazy były wyświetlane po wywołaniu getView, ale tylko te początkowe (które można zobaczyć bez przewijania) są przypisane poprawnie.

Muszę rozwiązać problem, generując widok w kółko, ale to oczywiście nie jest właściwa droga.

Oto pliki Używam:

Siatka komórek:

<?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: (jedyny realizowany metodą)

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

} 

To jest moje pierwsze pytanie, więc jeśli popełniłem jakieś błędy, proszę powiedz mi. Z góry dziękuję.

Odpowiedz

4

Myślę, że błąd występuje w Twoim getView adaptera. ConvertView nie będzie utrzymywać zasobów dostępnych przez findViewById() i whatnot, tylko nadęty widok. Spróbuj zmienić go na coś takiego:

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

To załatwiło sprawę. Wielkie dzięki. –

+0

bez problemu. Awansuj i zaakceptuj, jeśli ci się udało. – SeanPONeil

+0

Nie można przeprowadzić awansu, wymaga 15 reputacji. Przepraszam. –

Powiązane problemy