0

我一直在使用 android 中的 ListViews 和 ExpandableListViews。而且我知道如何通过制作一个 customAdaper 来使用图像和文本填充列表视图 - 以及扩展例如 Arrayadapter 的适配器类。

在我正在开发的这个应用程序中,我将 Spinner 与 ArrayAdapter 一起使用。在 ArrayAdapter 的子类中,我重写了 getView 方法以使用文本和图像填充视图。

但问题是 getView 只被调用一次 - 当应用程序启动和从列表中选择一个项目时显示的第一个列表项。在这里它似乎工作。但是当我通过列表扩展列表时,不会调用 getView 方法 - 仅将字符串中的名称放入列表中

String[] string = {"ssun", "venus", "earth", "march"};

我想要的是完全控制视图,这样我就可以用我自己的图标、文本等填充整个列表——这正是以前对 ListView 和 Expandable ListView 对象所做的。

我知道我在这里做错了,我可以看到 getView 方法只调用第一个/选定的项目的逻辑。但我希望调用所有视图,因此我有一个包含图像图标和操作文本的漂亮列表。

在扩展 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[]

在此处输入图像描述

4

2 回答 2

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/适配器

于 2014-08-03T12:00:44.267 回答
0

我假设(大部分情况下)您没有使用 Fragments,因此您并不需要一个自定义适配器来让微调器更改图像,它们都位于一个活动中。

http://developer.android.com/guide/topics/ui/controls/spinner.html,你应该

  • 确保您的活动课程implements OnItemSelectedListener
  • 添加onItemSelected,如果需要onNothingSelected,把你的
  • 图像选择器代码登录里面onItemSelected(记得用来 parent.getItemAtPosition(pos)获取当前位置)。
于 2014-08-03T11:40:27.320 回答