Адаптер Android с неправильным форматом/представлениями для GridView

Я делаю собственный адаптер FieldAdapter, который расширяет BaseAdapter. Я создал GridView представлений LinearLayout, которые содержат TextView и либо Spinner ИЛИ EditText.

Кажется, после долгих поисков оптимальным методом является использование метода ViewHolder. Но это, кажется, оптимизировано для списка элементов, которые имеют одни и те же атрибуты.

Что делает это потенциальной проблемой, так это тот факт, что у меня может быть 4 представления с TextView и EditText и еще 5, которые содержат TextView и счетчик, поэтому я не могу предположить определенный макет.

Оптимально ли иметь логику в моем методе getView, которая проверяет, какой вид должен быть возвращен для каждого элемента, или есть лучший способ? Должен ли я просто иметь объекты ViewHolder для хранения соответствующих макетов? т.е. DropdownViewHolder и TextViewHolder?

Делает ли это convertView бесполезным?

Ниже приведен мой код, который работает, но я заметил, что если у меня есть большой список элементов и я быстро прокручиваю вверх и вниз, весь мой список исчезает, что заставляет меня поверить, что я что-то делаю неправильно.

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

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout layoutSection = (LinearLayout) inflater.inflate(R.layout.dropdown, null);

        TextView labelText = new TextView(this.context);
        labelText.setText(data.get(position).getLabelText());
        labelText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        layoutSection.addView(labelText);

        if (data.get(position).getFieldType().equalsIgnoreCase("dropdown")) {
            Spinner spinner = new Spinner(this.context);
            spinner.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            // Options
            final List<String> options = new ArrayList<String>();
            ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context,
                    android.R.layout.simple_list_item_1, options);
            spinner.setAdapter(spinnerAdapter);


            layoutSection.addView(spinner);
        } else if (data.get(position).getFieldType().equalsIgnoreCase("text")) {
            EditText textbox = new EditText(this.context);
            textbox.setText("Hi");
            textbox.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            layoutSection.addView(textbox);
        }

        return layoutSection;
    } else {
        return convertView;
    }
}   

person adam8810    schedule 14.12.2013    source источник


Ответы (1)


см. эти методы: getItemViewType и getViewTypeCount

person pskink    schedule 14.12.2013