2012-08-26 18 views
6

Ho un GridView nella mia applicazione in cui voglio mostrare il testo e le caselle di controllo come la pagina della posta in arrivo di posta elettronica. Io uso un adattatore per questo, ma quando mostro più di 15 elementi il ​​testo e le caselle di controllo delle righe in alto scompaiono, così quando scorro di nuovo verso l'alto non sono visibili. Ecco il mio codiceIl contenuto GridView scompare durante lo scorrimento

public class EmployeeAdaptor extends BaseAdapter { 
Context context; 
String [] table; 
int pos; 
int formatOfTable; 
public EmployeeAdaptor(Context c,String []tab,int numberOfItems,int format, boolean[] sel) { 
    context = c; 
    table = tab; 
    items = numberOfItems; 
    formatOfTable = format; 
    //ifformat is 0 then show text view in first column 
    //if it is 1 then show radio button in first column 
    //if it is 2 then show check box in first column. 
    pos = 0; 
} 
public int getCount() { 
    // 
    return items; 
} 

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

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

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

    View v; 
    TextView text = new TextView(context); 
    RadioButton radio = new RadioButton(context); 
    CheckBox check = new CheckBox(context); 

    if(convertView == null){ 
     v = new View(context); 
    } 
    else{ 
     v = convertView; 
    } 

    if(formatOfTable==2 && position%5==0 && position/5!=0){ 
     check.setId(position/5); 
     v = check; 

    } 
    else if(formatOfTable==0 && position%5==0 && position/5!=0){ 
     text.setText(""); 
     v = text; 
     //To set blank text at first position when no need of check 
    } 
    else{ 
     if(position%5!=0){ 
      try{ 
       v = text; 
       text.setText(table[pos]); 
       text.setTextColor(Color.BLACK); 
       text.setTextSize(20); 
       pos++; 
      } 
      catch(Exception e){ 

      } 
     } 
    } 
    if(position/5==0){ 
     text.setTypeface(Typeface.DEFAULT_BOLD); 
    } 
    return v; 
} 
    } 

Chiama per adattatore classe è come: file XML

table.setAdapter(new EmployeeAdaptor(this, empTable, numberofboxes, 0, selected)); 
//OR 
table.setAdapter(new EmployeeAdaptor(this, empTable, numberofboxes, 1, selected)); 

Layout è

<GridView 
    android:id="@+id/gridView1" 
    android:layout_width="wrap_content" 
    android:layout_height="360dp" 
    android:layout_marginTop="40dp" 
    android:numColumns="5" android:verticalSpacing="35dp"> 
</GridView> 
+0

È possibile visualizzare il layout xml utilizzato dall'adattatore? – Vicent

+0

Adapter definisce l'oggetto in modo dinamico, quindi non è necessario il layout XML. – ADCDER

risposta

-1

Credo che il GridView è solo pieno e scorre verso il basso (in modo che il automaticamente i primi elementi "lasciano" in alto) quando aggiungi nuovi elementi. C'è spazio per più di 15 articoli? Soprattutto da quando hai corretto l'altezza della tua GridView a 360dp? È possibile impostare un colore di sfondo per GrugView per il debug per vedere quanto spazio ottiene GridView e quanto viene assorbito dai primi 15 elementi.

+0

L'altezza di GridView impostata su 360 dpi non ha importanza perché ha un'opzione di scorrimento. Può memorizzare anche 50 righe ma le righe superiori diventano invisibili quando lo faccio scorrere. – ADCDER

+0

Penso di non comprenderti correttamente. Se scorre, la parte diventa invisibile. Questo è quello che mi aspetterei. – Jochem

1

Il problema sembra essere che non si stanno riciclando le viste correttamente. Il seguente esempio minimo si basa su una semplificazione del codice (ho eliminato alcuni membri e alcuni blocchi condizionali). Sono considerati solo due tipi di celle, TextView e CheckBox.

public class EmployeeAdaptor extends BaseAdapter { 
    private Context context; 
    public String [] table; 
    private int items; 

    public EmployeeAdaptor(Context c,String []tab,int numberOfItems) { 
     context = c; 
     items = numberOfItems; 
    } 

    @Override 
    public int getCount() {return items;} 

    @Override 
    public Object getItem(int position) {return position;} 

    @Override 
    public long getItemId(int position) {return position;} 

    @Override 
    public int getItemViewType(int position) { 
     int viewType; 
     if (position%5 == 0 && position/5 != 0) { 
      // Positions 5, 10, 15... 
      // Return a CheckBox 
      viewType = 0; 
     } else { 
      // Return a TextView 
      viewType = 1; 
     } 
     return viewType; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v; 
     if (convertView == null) { 
      if (position%5 == 0 && position/5 != 0) { 
       // Positions 5, 10, 15... 
       // Return a CheckBox 
       v = new CheckBox(context); 
      } else { 
       // Return a TextView 
       v = new TextView(context); 
      } 
     } else { 
      v = convertView; 
     } 
     if (position < 5) { 
      ((TextView)v).setTypeface(Typeface.DEFAULT_BOLD); 
      ((TextView)v).setText(table[position]); 
     } else if (position%5 == 0 && position/5 != 0) { 
      // Positions 5, 10, 15... 
      ((CheckBox)v).setId(position/5); 
     } else { 
      ((TextView)v).setTypeface(Typeface.DEFAULT); 
      ((TextView)v).setText(table[position]); 
     } 
     return v; 
    } 
} 

Nota l'uso di getViewTypeCount e getItemViewType. Ti aiutano quando il tuo getView si occupa di diversi tipi di visualizzazioni.

Problemi correlati