Можно ли каким-то образом установить другое представление для вида закрытого вращающегося элемента и вида элемента вращающегося элемента?
Я предполагаю, что идентификатор ресурса, используемый в ArrayAdapter
, будет использоваться как для закрытого представления элементов, так и для представлений элементов, поэтому я расширил ArrayAdapter
и определил getView
, который используетдругой ресурс, но идентификатор ресурса в вызове супер-конструктора, кажется, никогда не используется, кажется, используется только идентификатор ресурса, используемый в getView
В Spinner.javaкод он гласит:
Адаптер счетчика позволяет определять два разных представления: одно, которое показывает данные в самом счетчике, и другое, которое показывает данные в раскрывающемся списке, когда счетчикнажата.
но это не представляется возможным, учитывая код.
В любом случае - мой код:
public class CustomArrayAdapter <T> extends ArrayAdapter<T> {
int itemViewResourceId;
private LayoutInflater inflater;
ViewPopulator<T> viewPopulator;
private List<T> objects;
public CustomArrayAdapter(Context context, int textViewResourceId, int itemViewResourceId, ViewPopulator<T> viewPopulator, List<T> 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<T> {
public abstract void populateView(int position, View convertView, ViewGroup parent, T item);
}
вызывается с:
CustomArrayAdapter<T> typeAdapter = new CustomArrayAdapter<T>(context, R.layout.list_item, R.layout.list_item_big, new ViewPopulator<T>() {
@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;
}