Spinner 仅根据用户操作更新

Spinner updating only on user actions

我有 IconText,里面有图像和文本视图,class 和 xml。

然后,我使用扩展的 BaseAdapter (IconTextAdapter) 作为适配器,使用这些 IconText 填充 MainActivity 内的 Spinner。

现在,IconText 可以正常工作(按应有的方式显示)。 然而微调器没有。

  1. 当我启动应用程序时,它会显示第一个 IconText。
  2. 当我打开选择对话框时,一切都按预期显示。
  3. 当我 select 另一个项目时,选择对话框折叠并且微调器不显示 IconText(即只有 "arrow down" 用于打开选择对话框)。

我仍然可以打开选择对话框并选择另一个。 我注意到,如果我退出应用程序(return 按钮,而不是真正退出应用程序)并再次输入,则会显示正确的 IconText。

估计是适配器的问题吧? 我会尽量避免 posting 大量代码 [:

IconText.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView android:id="@+id/it_image"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:src="@drawable/home"/>

    <TextView
        android:id="@+id/it_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="20sp"
        android:text="ABC"
        android:textColor="@color/black_overlay"
        android:textSize="20sp"
        android:textStyle="bold" />
</LinearLayout>

IconText.java

public class IconText {

    static LayoutInflater inflator;

    public ImageView icon;
    public TextView text;
    public View view;

    public IconText(String title, int icon_id){
        Log.d("IconText", "Create");
        view = inflator.inflate(R.layout.icon_text, null);

        text = (TextView) view.findViewById(R.id.it_text);
        icon = (ImageView) view.findViewById(R.id.it_image);

        text.setText(title);
        icon.setImageResource(icon_id);
    }

    public static void initInflator(Context context){
        if(inflator != null) return;
        Log.d("IconText", "Init inflator");
        inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
}

IconTextAdapter.java

public class IconTextAdapter extends BaseAdapter implements SpinnerAdapter{

    public ArrayList<IconText> items;

    public IconTextAdapter(){
        super();
        items = new ArrayList<>();
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int arg0) {
        return items.get(arg0);
    }

    @Override
    public long getItemId(int position) {
        return items.get(position).view.getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return items.get(position).view;
    }
}

MainActivity,相关代码

void initFilter(){
        Log.d("MainAction", "Find Filter");
        filter = (Spinner) findViewById(R.id.filter);
        Log.d("MainAction", "Create Adapter");
        IconTextAdapter adapter = new IconTextAdapter();

        Log.d("MainAction", "Create items");
        for(int i=0; i<ETypes.names.length; i++){
            IconText it = new IconText(ETypes.names[i], ETypes.icons[i]);
            adapter.items.add(it);
        }
        Log.d("MainAction", "Setting adapter");
        filter.setAdapter(adapter);
    }

EType 名称[string] 和图标[id] 是静态的。 充气机初始化成功。

我在 Android 工作不多。如果是 Java/Swing,我想我会调用重绘之类的。

我知道这里有一些不好的做法(所有 public 变量,等等)。此代码仍处于早期原型阶段,将很快修复。我不是在寻找优化,只是为了解决我的问题。

更新一: 所以我看到我没有实现 getDropDownView 所以我实现了,与 getView 相同的代码(不需要 post 吗?)。

我还做了一个实验:在 IconText contrusctor 的末尾我添加了

view = text

它工作得很好(只显示文本)。

我想这表明问题出在自定义视图上?

更新 2:

对 IconText 进行了另一项实验,设置 view = icon;,但它没有正常运行,即。它的行为就像是自定义视图。

要更新列表,您必须致电 adapter.notifyDataSetChanged()

向适配器添加新数据后

请参考以下内容

https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

并没有真正解决这个特定的错误,但它解决了我的问题。

Custom Image and Text View in Spinner Solution.