2013-02-21 3 views
1

Я создал пользовательский ArrayAdapter для Spinner. Разница в том, что он отображает изображения из ArrayList сложного класса вместо обычного текста. Он работает до сих пор. Изображения и переключатели отображаются по желанию. Проблема заключается в том, что раскрывающееся представление не ведет себя правильно: оно не закрывается щелчком, и только переключатели могут переключаться без использования всего представления.Custom ArrayAdapter для Spinner: выпадающий вид не работает должным образом

Есть ли у кого-нибудь идеи, что не так? Должен ли я реализовать какой-то listener в adapter ??

Вот код метода 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

Fantastic !! Это так, но в чем причина? –

+2

Поскольку реализация Spinner допускает только один объект с возможностью фокусировки в представлении. Если вы установите фокус переключателя, переключитесь на переключатель, чтобы элемент потерял фокус. .. Почему вы не можете нажать – Pragnani

+0

Спасибо! Я только заметил, что все еще есть небольшая проблема: щелчок по изображению выбирает элемент и закрывает диалог. Но щелчок на «RadioButton» проверяет «RadioButton», но не закрывает «диалог». Любая идея для этой проблемы? Заранее спасибо! –

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

Да, пробовал, но без изменений :( –

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> 
Смежные вопросы