【问题标题】:Custom ArrayAdapter for a Spinner: drop down view not working properlySpinner 的自定义 ArrayAdapter:下拉视图无法正常工作
【发布时间】:2013-10-12 22:18:41
【问题描述】:

我为Spinner 创建了一个自定义ArrayAdapter。不同之处在于,它显示来自复杂类的ArrayList 的图像,而不是纯文本。到目前为止它有效。图像和单选按钮将根据需要显示。问题是,下拉视图的行为不正确:它不会在单击时关闭,并且只有单选按钮是可单击的,而不是整个视图。

有人知道出了什么问题吗?我是否必须在adapter 中实现某种listener??

这是getDropDownView方法的代码:

@Override
    public View getDropDownView(int position, View convertView,
                                ViewGroup parent) {

        LayoutInflater inflater=(LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout view=(LinearLayout)inflater.inflate(R.layout.spinnerimageitem, null);

        ImageView iv=(ImageView)view.getChildAt(0);
        RadioButton rb=(RadioButton)view.getChildAt(1);

        int iImageID=ctx.getResources().getIdentifier(
                "f_"+funcs.get(position).getBitmapSetup(), 
                "drawable", ctx.getPackageName());  
        if(loco.getFunction(iIndex).equals(funcs.get(position)))
            rb.setChecked(true);
        iv.setImageResource(iImageID);
        return(view);
    }

【问题讨论】:

    标签: android custom-controls spinner adapter


    【解决方案1】:

    在单选按钮的布局中设置android:focusable="false"

    【讨论】:

    • 太棒了!!是这样,但原因是什么?
    • 因为 Spinner 实现只允许视图中有一个可聚焦的项目。如果您设置单选按钮焦点将转移到单选按钮所以项目失去了焦点..这就是你无法点击的原因
    • 谢谢!我刚刚注意到,仍然存在一个小问题:单击图像会选择项目并关闭对话框。但是单击RadioButton 会检查RadioButton,但不会关闭dialog。对这个问题有任何想法吗?提前致谢!
    • @ThomasKusch 您是否为单选按钮设置了 onClick 侦听器...?为单选按钮设置 OnClickListener(因为在这种情况下 OncheckedChangeLister 和 onclickLister 都将相同),当单选按钮被选中时,通过代码关闭对话框。
    • 真的很抱歉再次打扰您,但我找不到太多关于此问题的信息...如何从适配器访问对话框引用?
    【解决方案2】:

    我遇到了同样的问题。对于以后会遇到这个问题的人,我找到了一个解决方案。

    public class MyActivity extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        ArrayList<String> items = new ArrayList<String>();
        for (int i=1; i<6; i++) items.add("Spinner item "+i);
        spinner.setAdapter(new SpinnerAdapter(this,R.layout.spinner_item_list,items));
    }
    
    public class SpinnerAdapter extends ArrayAdapter<String> {
        private ArrayList<Boolean> mChecked;
        private ArrayList<String> mValues;
        private Context mContext;
        public SpinnerAdapter(Context context, int resourceId, ArrayList<String> values) {
            super(context, resourceId, values);
            mValues = values;
            mContext = context;
            mChecked = new ArrayList<Boolean>();
            for (int i=0; i<mValues.size(); i++){
                mChecked.add(false);
            }
        }
        @Override
        public View getDropDownView(int position, View convertView,ViewGroup parent) {
                View row= View.inflate(mContext,R.layout.spinner_item_list, null);
                TextView label=(TextView)row.findViewById(R.id.textView);
                label.setText(mValues.get(position));
                RadioButton rb = (RadioButton)row.findViewById(R.id.radioButton);
                rb.setFocusable(false);
                rb.setClickable(false);
                rb.setChecked(mChecked.get(position));
                return row;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = View.inflate(mContext,R.layout.spinner_item_top, null);
            TextView label=(TextView)row.findViewById(R.id.textView);
            label.setText(mValues.get(position));
            for(int i=0; i<mChecked.size(); i++){
                mChecked.set(i,(i==position));
            }
            return row;
        }
    }
    }
    

    spinner_item_list.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"                     xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/textView" android:layout_centerVertical="true"/>
    <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/radioButton" android:layout_alignParentRight="true"     android:checked="false"/>
     </RelativeLayout>
    

    spinner_item_top.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/textView"></TextView>
    

    【讨论】:

      【解决方案3】:

      你试过这样吗:

      @Override
      public View getDropDownView(int position, View convertView,
                                  ViewGroup parent) {
          View view = convertView;
          if(view == null){
              LayoutInflater inflater=(LayoutInflater)
                         tx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              view=(LinearLayout)inflater.inflate(R.layout.spinnerimageitem, null);
          }
           /// your code ....
           return view;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多