Содержимое GridView исчезает во время прокрутки

У меня есть GridView в моем приложении, в котором я хочу показать текст и флажки, как и в папке входящих сообщений электронной почты. Я использую адаптер для этого, но когда я показываю более 15 элементов, текст и флажки верхних строк исчезают, поэтому, когда я снова прокручиваю вверх, они не видны. Вот мой код

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

Вызов класса адаптера:

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

Макет XML-файла

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

Проблема заключается в том, что вы неправильно пересматриваете представления. Следующий минимальный пример основан на упрощении вашего кода (я избавился от некоторых членов и некоторых условных блоков). Рассматриваются только два типа ячеек, TextView и 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; } } 

Обратите внимание на использование getViewTypeCount и getItemViewType . Они помогают вам, когда ваш getView имеет дело с различными типами просмотров.

Я думаю, что GridView просто заполнен и автоматически прокручивается вниз (поэтому первые позиции «уходят» вверху) при добавлении новых элементов. Есть ли место для более чем 15 предметов? Тем более, что вы установили высоту вашего GridView на 360dp? Вы можете установить фоновый цвет в GridView для отладки, чтобы узнать, сколько места занимает GridView и сколько занимает первые 15 элементов.