Я работаю в значительной степени с ListViews и ExpandableListViews в android. И я знаю, как заполнять списки с изображениями и текстом, создавая один customAdaper - и adapterclass, расширяющий, например, Arrayadapter.Populate ArrayList с представлениями при использовании объекта Spinner
В этом приложении я разрабатываю теперь, когда я использую Spinner togehter с ArrayAdapter. В подклассе ArrayAdapter я переопределяю getView-метод для заполнения представлений текстом и изображениями.
Но проблема в том, что getView вызывается только один раз - для первого списка отображается, когда приложение запускается и при выборе элемента из списка. Здесь он работает. Но когда я расширяю список через список, метод getView НЕ вызывается - только имена из строки помещаются в список
Строка [] string = {"ssun", "venus", "earth", " "Март"};
Я хочу, чтобы иметь полный контроль над представлениями, чтобы я мог заполнить весь список своими собственными значками, текстом и т. Д. - как это было с объектами ListView и Expandable ListView.
Я знаю, что здесь что-то не так, и я вижу логику, что только первый/выбранный элемент вызывается методом getView. Но я хочу, чтобы все виды были вызваны, поэтому у меня есть хороший список с изображениями и управляемый текст.
В классе, который расширяет активность
Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
String[] string = {"sun", "venus", "earth", "march"};
MyArrayAdapter adapter = new MyArrayAdapter(this, string);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
И в CustomAdapter
public class MyArrayAdapter extends ArrayAdapter <String> {
private final String[] values;
private final Context context;
public MyArrayAdapter(Context context, String[] values) {
super (context, R.layout.celestial_list, values);
this.values = values;
this.context = context;
}
private static class ViewHolder {
TextView textView;
ImageView imageView;
ImageView infoView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.celestial_list, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) view.findViewById(R.id.label);
viewHolder.imageView = (ImageView) view.findViewById(R.id.icon);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
System.out.println("view = " + view + " för position " + position);
viewHolder.textView.setText(values[position]);
switch (position) {
case 0:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
case 1:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
case 2:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
case 3:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
}
return view;
}
}
Скриншот 1. Кажется, хорошо - GetView называется ...
Скриншот 2, но только для выбранного списка - не для остальных. Только String [] используются здесь
ok спасибо - но я получаю ** IllegalStateException: для ArrayAdapter требуется идентификатор ресурса textView. ** Вероятно, там, где я делаю супер-вызов конструктора базового класса, в котором передается ресурс. Я передаю весь макет. Это нормально, если я использую метод getView. Но теперь, когда я использую метод getDropDownView, я получаю это исключение и сбой. Вопрос в том, как я получаю текст? Мне нужно раздувать xml-файл, как и в getView? – user3155478
Используйте 'BaseAdapter' вместо' ArrayAdapter', а затем в newDropDownView() вам нужно раздуть ваш XML-макет (настроить ViewHolders и т. Д.) ... – sockeqwe
Я изменил на BaseAdapter, но теперь проблема в том, что getView и getDropDownView не называется. И я больше не могу использовать setDropDownViewResource(); – user3155478