使用Spinner对象时,使用视图填充ArrayList

时间:2014-08-03 10:32:01

标签: android android-arrayadapter android-spinner getview

我一直在使用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 ......

enter image description here

屏幕截图2但仅适用于所选的列表对象 - 不适用于其余部分。这里只使用String []

enter image description here

2 个答案:

答案 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