2013-02-21 78 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>