Java 微调器仅在用户操作上更新

Java 微调器仅在用户操作上更新,java,android,user-interface,spinner,android-adapter,Java,Android,User Interface,Spinner,Android Adapter,我有一个IconText,里面有图像和文本视图,包括类和xml 然后,我使用扩展BaseAdapter(IconTextAdapter)作为适配器,用这些IconTexts填充MainActivity内部的微调器 现在,IconText可以正常工作(显示它应该显示的内容)。 然而,Spinner并没有这样做 当我启动应用程序时,它会显示第一个IconText 当我打开“选择”对话框时,所有内容都按应有的方式显示 当我选择另一个项目时,“选择”对话框将折叠,微调器不显示IconText(即,打开“

我有一个IconText,里面有图像和文本视图,包括类和xml

然后,我使用扩展BaseAdapter(IconTextAdapter)作为适配器,用这些IconTexts填充MainActivity内部的微调器

现在,IconText可以正常工作(显示它应该显示的内容)。 然而,Spinner并没有这样做

  • 当我启动应用程序时,它会显示第一个IconText
  • 当我打开“选择”对话框时,所有内容都按应有的方式显示
  • 当我选择另一个项目时,“选择”对话框将折叠,微调器不显示IconText(即,打开“选择”对话框时仅显示“向下箭头”)
  • 我仍然可以打开“选择”对话框并选择另一个。 我注意到,如果我退出应用程序(返回按钮,而不是真正退出应用程序)并再次输入,则会显示正确的IconText

    我想是适配器的问题吧? 我将尽量避免发布大量代码[:

    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>
    
    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;
        }
    }
    
    它工作得很好(只显示文本)

    我想这正好说明问题源于自定义视图

    更新2:


    对IconText做了另一个实验,设置了
    view=icon;
    ,但它的行为与它应该的不一样,即,它的行为就像是一个自定义视图。

    要更新列表,必须调用
    adapter.notifyDataSetChanged()

    将新数据添加到适配器后

    请参考以下内容


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


    Hmmm,我应该在哪里调用它?我在设置适配器之前创建了所有数据…你可以在用新主题替换主题时处理事件的地方调用它…happy coding bro:)你能在github上发布一个简单的项目吗?我想我已经解决了…只需要一点时间来测试一下。如果我错了,我会我不想告诉github,但我想避免这样做,因为这不是一个个人项目。很高兴看到你解决了这个问题。如果你解释一下getView和getDropDownView方法的错误所在,会更好。我有很多事情要做,如果/当我有时间的话,我会找出确切的问题。
    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;
        }
    }
    
    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);
        }
    
    view = text