Есть ли способ установить другое представление для представления закрытого счетчика и представления элемента счетчика?
Я предполагаю, что идентификатор ресурса, используемый в ArrayAdapter
, будет использоваться для закрытого представления элементов, а также для представлений элементов, поэтому я расширил ArrayAdapter
и определил getView
, который использует другой ресурс, но идентификатор ресурса в вызове суперконструктора, похоже, никогда не используется, используется только идентификатор ресурса, используемый в getView
В коде Spinner.java говорится:
Адаптер счетчика позволяет определять два разных представления: одно, которое показывает данные в самом счетчике, и другое, которое показывает данные в раскрывающемся списке. когда вертушка нажата.
но это кажется невозможным, учитывая код.
В любом случае - мой код:
public class CustomArrayAdapter extends ArrayAdapter {
int itemViewResourceId;
private LayoutInflater inflater;
ViewPopulator viewPopulator;
private List objects;
public CustomArrayAdapter(Context context, int textViewResourceId, int itemViewResourceId, ViewPopulator viewPopulator, List objects) {
super(context, textViewResourceId, objects);
inflater = LayoutInflater.from(context);
this.viewPopulator = viewPopulator;
this.itemViewResourceId = itemViewResourceId;
this.objects = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null || convertView.getTag() == null) {
// new view - populate
convertView = inflater.inflate(itemViewResourceId, parent, false);
convertView.setTag(new Object());
}
viewPopulator.populateView(position, convertView, parent, objects.get(position));
return convertView;
}
}
public abstract class ViewPopulator {
public abstract void populateView(int position, View convertView, ViewGroup parent, T item);
}
вызывается с помощью:
CustomArrayAdapter typeAdapter = new CustomArrayAdapter(context, R.layout.list_item, R.layout.list_item_big, new ViewPopulator() {
@Override
public void populateView(int position, View convertView, ViewGroup parent, T item) {
((TextView) convertView.findViewById(R.id.list_item)).setText(position + " - " + item.getName());
}
}, itemsByType.get(type));
** EDIT **
Используемый идентификатор ресурса - это itemViewResourceId
, определенный в методе getView
-
добавление нового метода в CustomArrayAdapter
, переопределение getDropDownView
, как показано ниже, дает мне те же результаты, что и для itemViewResourceId
, используемого для всех стилей, и textViewResourceId
вообще не используется. Однако удаление getView
приводит к использованию textViewResourceId
- поэтому я не думаю, что getDropDownView
действительно что-то делает:
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if(convertView == null || convertView.getTag() == null) {
// new view - populate
convertView = inflater.inflate(itemViewResourceId, parent, false);
convertView.setTag(new Object());
}
viewPopulator.populateView(position, convertView, parent, objects.get(position));
return convertView;
}