有没有什么办法可以为关闭的微调器视图和微调器项视图设置不同的视图?
我假设ArrayAdapter
中使用的资源ID将用于已关闭的项目视图以及项目视图,因此我扩展了ArrayAdapter
并定义了getView
它使用不同的资源,但是对超级构造函数的调用中的资源ID似乎从未使用过,只有getView
中使用的资源ID似乎被使用
在Spinner.java code中声明:
微调器适配器允许定义两个不同的视图:一个用于显示微调器本身的数据,另一个用于在按下微调器时显示下拉列表中的数据。
但鉴于代码,它似乎不可能。
无论如何 - 我的代码:
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));
**编辑**
使用的资源ID是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;
}
答案 0 :(得分:20)
如果您实施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;
}
}
答案 1 :(得分:5)
虽然这是一个老问题,但我偶然发现了试图解决同样的问题。
我使用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);
答案 2 :(得分:2)
实际上,为扩展(打开)和折叠(关闭)View
获取不同的Spinner
就像覆盖适配器的getView
和getDropdownView
方法一样简单。< / p>
getView(int position, View convertView, ViewGroup parent)
会生成View
折叠时用于显示所选项目的所有Spinner
。
getDropDownView(int position, View convertView, ViewGroup parent)
进行展开并显示商品的下拉列表列表时,会调用 {strong> 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;
}
答案 3 :(得分:0)
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));
答案 4 :(得分:-1)
//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;
}
}
//-------------------------