Содержимое 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>

person ADCDER    schedule 26.08.2012    source источник
comment
Можете ли вы показать макет xml, используемый адаптером?   -  person Vicent    schedule 26.08.2012
comment
Адаптер определяет объект динамически, поэтому XML-макет не нужен.   -  person ADCDER    schedule 26.08.2012


Ответы (2)


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

person Vicent    schedule 26.08.2012

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

person Jochem    schedule 26.08.2012
comment
Высота GridView, установленная на 360dp, не имеет значения, поскольку у нее есть возможность прокрутки. Он также может хранить 50 строк, но верхние строки становятся невидимыми, когда я прокручиваю их. - person ADCDER; 26.08.2012
comment
Я думаю, что я не понимаю вас правильно. Если он прокручивается, часть становится невидимой. Это то, чего я ожидал. - person Jochem; 27.08.2012