Различные виды для прядильщика и элемента с прядильщиками?
Есть ли способ, которым я могу установить другое представление для закрытого представления счетчика и представления элемента 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;
}
Ответы
Ответ 1
Если вы реализуете SpinnerAdapter
, это поможет?
Для меня работает следующий код:
private class CustomSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
String[] values;
Context context;
public NumberSpinnerAdapter(String[] values) {
this.values = values;
this.context = context;
}
@Override
public int getCount() {
return values.length;
}
@Override
public Object getItem(int position) {
return values[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_item, null);
textView.setText(values[position]);
return textView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_dropdown_item, null);
textView.setText(values[position]);
return textView;
}
}
Ответ 2
Хотя это старый вопрос, я наткнулся на попытку решить ту же проблему.
Я использую setDropDownViewResource
:
Spinner mySpinner = (Spinner) mView.findViewById(R.id.mySpinner);
ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(...);
myAdapter.setDropDownViewResource(R.layout.my_simple_spinner_dropdown_item);
mySpinner.setAdapter(adapter);
Ответ 3
Собственно, получение разного View
для расширенного (открытого) и свернутого (закрытого) Spinner
так же просто, как переопределение методов getView
и getDropdownView
вашего адаптера.
getView(int position, View convertView, ViewGroup parent)
создаст все View
, которые будут использоваться для отображения выбранного элемента при сбрасывании Spinner
.
getDropDownView(int position, View convertView, ViewGroup parent)
вызывается при нажатии на Spinner
, чтобы развернуть его и отобразить выпадающий список ваших элементов. Вы можете вызвать getView
из этого метода (если ваши элементы в расширенных и свернутых состояниях схожи) или создать другой View
для элемента в раскрывающемся списке.
Было бы неплохо, если бы вы переопределили оба эти методы (даже если ваш getDropdownView
просто вызывает getView
с теми же аргументами). И не забудьте использовать ваш параметр convertView
- он здесь с целью оптимизации (повторно использовать существующие представления вместо того, чтобы раздувать/создавать их каждый раз):
public View getView(int position, View convertView, ViewGroup parent) {
...
if(convertView == null){
convertView = View.inflate(getContext(),
R.layout.dropdown_category_color, null);
}
//...do your stuff with your View
return convertView;
}
Ответ 4
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));
Ответ 5
//1---------------
package testing;
public class SpinnerItemAdapterData {
public int id ;
public String name;
public SpinnerItemAdapterData(int id, String name) {
this.id = id;
this.name = name;
}
public int getId(){
return this.id;
}
public String getName(){
return this.name;
}
}
//-------------------------