我一直在使用Android中的ListViews和ExpandableListViews。我知道如何通过制作一个customAdaper来扩展listviews和图像和文本 - 并且适配器类扩展为Arrayadapter。
在我正在开发的这个应用程序中我正在使用一个带有ArrayAdapter的Spinner togehter。在ArrayAdapter的子类中,我重写了getView方法,用文本和图像填充视图。
但问题是getView只被调用一次 - 因为应用程序启动时和列表中选择项目时显示的第一个listitem。这似乎工作。但是当我通过列表扩展列表时,不调用getView方法 - 只将字符串中的名称放入列表中
String [] string = {“ssun”,“venus”,“earth”,“march”};
我想要的是完全控制视图,这样我就可以使用我自己的图标,文本等填充整个列表 - 就像使用ListView和Expandable ListView对象一样。
我知道我在这里做错了,我可以看到只有getView-method调用第一个/所选项的逻辑。但我希望所有的视图都被调用,所以我有一个很好的列表与图像和操纵文本。
在扩展Activity
的类中 Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
String[] string = {"sun", "venus", "earth", "march"};
MyArrayAdapter adapter = new MyArrayAdapter(this, string);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
CustomAdapter
public class MyArrayAdapter extends ArrayAdapter <String> {
private final String[] values;
private final Context context;
public MyArrayAdapter(Context context, String[] values) {
super (context, R.layout.celestial_list, values);
this.values = values;
this.context = context;
}
private static class ViewHolder {
TextView textView;
ImageView imageView;
ImageView infoView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.celestial_list, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) view.findViewById(R.id.label);
viewHolder.imageView = (ImageView) view.findViewById(R.id.icon);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
System.out.println("view = " + view + " för position " + position);
viewHolder.textView.setText(values[position]);
switch (position) {
case 0:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
case 1:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
case 2:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
case 3:
viewHolder.imageView.setImageResource(R.drawable.sun);
break;
}
return view;
}
}
屏幕截图1.似乎没问题 - 调用getView ......
屏幕截图2但仅适用于所选的列表对象 - 不适用于其余部分。这里只使用String []
答案 0 :(得分:0)
我假设(大多数情况下)您没有使用Fragments,因此您不需要为微调器更改Image的自定义适配器,其中两者都驻留在一个活动中。
每http://developer.android.com/guide/topics/ui/controls/spinner.html,你应该
implements OnItemSelectedListener
,onItemSelected
,如果需要onNothingSelected
,请填写onItemSelected
内登录(记得要使用
获得当前职位的parent.getItemAtPosition(pos)
。答案 1 :(得分:0)
Spinner适配器的工作方式略有不同:
你必须添加:
public class MyArrayAdapter extends BaseAdapter implements SpinnerAdapter {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = newDropDownView(parent);
}
bindDropDownView(position, convertView);
return convertView;
}
protected View newDropDownView(ViewGroup parent) { ... }
protected void bindDropDownView(int position, View view) { ... }
@Override
public View getView(int position, View convertView, ViewGroup parent) { ... }
}
因此,将在未展开微调器时显示当前所选项目的getView()。虽然将为微调器列表中的每个元素调用getDropDownView()。这就是你要找的东西。
顺便说一下。这里有一些有用的适配器类(使用dagger进行依赖注入,但你只需复制代码并擦除Injector类): https://github.com/sockeqwe/appkit/tree/master/adapter/src/main/java/com/hannesdorfmann/appkit/adapter