Я делаю собственный адаптер 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;
}
}