2012-08-26 15 views
6

Tengo un GridView en mi aplicación en la que quiero mostrar texto y casillas de verificación como en la página de la bandeja de entrada de correos electrónicos. Utilizo un adaptador para eso, pero cuando muestro más de 15 elementos, el texto y las casillas de verificación de las filas superiores desaparecen, así que cuando me muevo hacia arriba nuevamente no están visibles. Aquí está mi códigoEl contenido de GridView desaparece durante el desplazamiento

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

de llamadas al adaptador clase es como: archivo XML

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

diseño es

<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

¿Puede mostrar el diseño xml utilizado por el adaptador? – Vicent

+0

El adaptador define el objeto dinámicamente, por lo que no es necesario el diseño XML. – ADCDER

Respuesta

-1

Creo que el GridView sólo está lleno y se desplaza automáticamente hacia abajo (por lo que el primeros elementos 'salir' en la parte superior) cuando agrega elementos nuevos. ¿Hay espacio para más de 15 artículos? ¿Especialmente desde que arregló la altura de su GridView a 360dp? Podría establecer un color de fondo para su GridView para la depuración para ver cuánto espacio obtiene GridView y cuánto se ocupa en los primeros 15 elementos.

+0

La altura de GridView establecida en 360dp no importa porque tiene la opción de desplazamiento. Puede almacenar 50 filas también, pero las filas superiores se vuelven invisibles cuando lo desplazo. – ADCDER

+0

Creo que no te entiendo correctamente. Si se desplaza, una parte se vuelve invisible. Eso es lo que esperaría. – Jochem

1

El problema parece ser que no está reciclando las vistas correctamente. El siguiente ejemplo mínimo se basa en una simplificación de tu código (he eliminado algunos miembros y algunos bloqueos condicionales). Solo se consideran dos tipos de celdas, TextView y 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 el uso de getViewTypeCount y getItemViewType. Lo ayudan cuando su getView trata con diferentes tipos de vistas.

Cuestiones relacionadas