2013-02-21 55 views
1

我为Spinner创建了自定义ArrayAdapter。区别在于,它显示的是复杂类的ArrayList而不是纯文本的图像。它到目前为止工作。图像和单选按钮按需显示。问题是,下拉式视图的行为不正确:点击时不关闭,只有单选按钮可点击而不是整个视图。Spinner的自定义ArrayAdapter:下拉视图无法正常工作

有没有人知道有什么问题?我是否需要在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); 
    } 

回答

6

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

+0

神奇!那是,但是原因是什么? – 2013-02-21 19:46:01

+2

由于微调控件实现只允许一个可视对象在视图中。如果你设置单选按钮,焦点将转移到单选按钮,所以项目失去焦点..这就是为什么你无法点击 – Pragnani 2013-02-21 19:49:08

+0

谢谢!我只注意到,仍然存在一个小问题:单击图像选择该项目并关闭对话框。但单击“RadioButton”可检查“RadioButton”,但不会关闭“对话框”。任何想法这个问题?提前致谢! – 2013-02-21 19:52:45

0

你尝试过这样的:

@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; 
} 
+0

是的,尝试过,但没有改变:( – 2013-02-21 14:34:53

1

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

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>