2012-08-26 6 views
6

Mam w mojej aplikacji GridView, w której chcę wyświetlać tekst i zaznaczać pola, tak jak strona skrzynki odbiorczej e-maili. Używam do tego adaptera, ale gdy wyświetlam więcej niż 15 elementów, pola tekstowe i zaznaczające górnych rzędów znikają, więc gdy przewijam stronę do góry, nie są widoczne. Oto mój kodZawartość GridView znika podczas przewijania

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

Wezwanie do adaptera klasa jest jako:

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

Układ plik XML jest

<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

Czy można wyświetlić układ xml używany przez adapter? – Vicent

+0

Adapter dynamicznie definiuje obiekt, więc nie ma potrzeby stosowania układu XML. – ADCDER

Odpowiedz

-1

myślę GridView jest tylko pełne i automatycznie przewija w dół (tak pierwsze elementy "zostaw" u góry) po dodaniu nowych przedmiotów. Czy jest miejsce na więcej niż 15 przedmiotów? Zwłaszcza, że ​​ustaliłeś wysokość swojego GridView na 360dp? Można ustawić kolor tła w GridView w celu debugowania, aby zobaczyć, ile miejsca zajmuje GridView i ile zajmuje pierwsze 15 elementów.

+0

Wysokość GridView ustawiona na 360dp nie ma znaczenia, ponieważ ma opcję przewijania. Może przechowywać 50 rzędów, ale górne rzędy stają się niewidoczne, gdy je przewijam. – ADCDER

+0

Myślę, że nie rozumiem cię poprawnie. Jeśli przewija, część staje się niewidoczna. Tego właśnie bym się spodziewał. – Jochem

1

Problem polega na tym, że nie prawidłowo przetwarzasz widoki. Poniższy minimalny przykład opiera się na uproszczeniu kodu (pozbyłem się niektórych członków i niektórych bloków warunkowych). Rozważane są tylko dwa rodzaje komórek: TextView i .

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

Uwaga wykorzystanie getViewTypeCount i getItemViewType. Pomagają, gdy Twój getView zajmuje się różnymi typami widoków.