Есть ли способ, которым я могу установить другое представление для закрытого представления счетчика и представления элемента spinner?
Я предполагаю, что идентификатор ресурса, используемый в ArrayAdapter
, будет использоваться для представления закрытого элемента, а также представления элементов, поэтому я расширил ArrayAdapter
и определил getView
, который использует другой ресурс, но идентификатор ресурса в вызове суперконструктора, кажется, никогда не используется, используется только идентификатор ресурса, используемый в getView
В коде Spinner.java говорится:
Адаптер spinner позволяет определять два разных вида: один, который отображает данные в самом устройстве раскручивателя, и тот, который показывает данные в выпадающем списке при нажатии счетчика.
но это не представляется возможным с учетом кода.
В любом случае - мой код:
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));
** РЕДАКТИРОВАТЬ **
Используемый идентификатор ресурса - это 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;
}