7

Tôi có Spinner như thế này:spinner thả xuống android hộp kiểm

<Spinner 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/spinner1" 
       android:background="@drawable/spinner_bg" 
       android:popupBackground="@drawable/spinner_bg"/> 

đây là spinner_bg.xml:

<item> 
    <layer-list> 
     <item> 
      <shape> 
       <gradient 
        android:startColor="#ffffff" 
        android:centerColor="#111111" 
        android:endColor="#000000" 
        android:angle="-90" /> 

       <stroke 
        android:width="2dp" 
        android:color="#ffffff" /> 

       <corners 
        android:radius="2dp" /> 

       <padding 
        android:left="10dp" 
        android:right="10dp"/> 
      </shape> 
     </item> 
     <item > 
      <bitmap 
       android:gravity="right" 
       android:src="@android:drawable/arrow_down_float" /> 
     </item> 
    </layer-list> 
</item> 

đây là mã của tôi để chỉnh spinner :

ArrayAdapter<ClassId> adapter = new ArrayAdapter<ClassId>(getActivity(), 
         R.layout.list_id, idList); 
       adapter.setDropDownViewResource(R.layout.list_id_select); 

đây là cách bố trí của list_id.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textAllCaps="true" 
android:singleLine="true" 
android:ellipsize="end" 
android:textColor="#ff0004" 
android:textSize="14sp" 
android:paddingTop="10dp" 
android:paddingBottom="10dp"/> 

đây là cách bố trí của list_id_select.xml:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textAllCaps="true" 
android:singleLine="true" 
android:ellipsize="end" 
android:textColor="#0004ff" 
android:textSize="14sp" 
android:checked="true" 
android:checkMark="@drawable/custom_checkbox" 
android:paddingTop="10dp" 
android:paddingBottom="10dp"/> 

và đây là custom_checkbox.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_checked="true" 
    android:drawable="@android:drawable/checkbox_on_background" /> 

<item android:state_pressed="true" 
    android:drawable="@android:drawable/checkbox_on_background" /> 

<item android:drawable="@android:drawable/checkbox_off_background" /> 

này là kết quả của tôi khi thả xuống của spinner show: _________________________________________________
__________________________checkbox_______________
____text_________________________________________

đó có nghĩa là văn bản và hộp kiểm không phù hợp (hộp kiểm cao hơn văn bản).
cách khắc phục?

Trả lời

14

Để làm điều đó, bạn phải tạo Custom Adapter và đặt TextViewCheckBox bên trong cách bên dưới.

Xác định Spinner trong xml

<Spinner 
     android:id="@+id/spinner" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="10dp" /> 

Tạo spinner_item.xml tập tin trong thư mục layout.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="20dp" 
     android:text="text" 
     android:textAlignment="gravity" /> 

    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" /> 
</RelativeLayout> 

Bây giờ tạo StateVO.java lớp có thể chứa giá trị TextViewCheckBox.

public class StateVO { 
    private String title; 
    private boolean selected; 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 
} 

Bây giờ trong Activity bạn inititlize các Spinner và thiết lập CustomAdapter bên dưới đường.

final String[] select_qualification = { 
       "Select Qualification", "10th/Below", "12th", "Diploma", "UG", 
       "PG", "Phd"}; 
     Spinner spinner = (Spinner) findViewById(R.id.spinner); 

     ArrayList<StateVO> listVOs = new ArrayList<>(); 

     for (int i = 0; i < select_qualification.length; i++) { 
      StateVO stateVO = new StateVO(); 
      stateVO.setTitle(select_qualification[i]); 
      stateVO.setSelected(false); 
      listVOs.add(stateVO); 
     } 
     MyAdapter myAdapter = new MyAdapter(Main2Activity.this, 0, 
       listVOs); 
     spinner.setAdapter(myAdapter); 

Và cuối cùng tạo lớp học CustomAdapter như dưới đây.

MyAdapter.java

public class MyAdapter extends ArrayAdapter<StateVO> { 
    private Context mContext; 
    private ArrayList<StateVO> listState; 
    private MyAdapter myAdapter; 
    private boolean isFromView = false; 

    public MyAdapter(Context context, int resource, List<StateVO> objects) { 
     super(context, resource, objects); 
     this.mContext = context; 
     this.listState = (ArrayList<StateVO>) objects; 
     this.myAdapter = this; 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, 
           ViewGroup parent) { 
     return getCustomView(position, convertView, parent); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return getCustomView(position, convertView, parent); 
    } 

    public View getCustomView(final int position, View convertView, 
           ViewGroup parent) { 

     final ViewHolder holder; 
     if (convertView == null) { 
      LayoutInflater layoutInflator = LayoutInflater.from(mContext); 
      convertView = layoutInflator.inflate(R.layout.spinner_item, null); 
      holder = new ViewHolder(); 
      holder.mTextView = (TextView) convertView 
        .findViewById(R.id.text); 
      holder.mCheckBox = (CheckBox) convertView 
        .findViewById(R.id.checkbox); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.mTextView.setText(listState.get(position).getTitle()); 

     // To check weather checked event fire from getview() or user input 
     isFromView = true; 
     holder.mCheckBox.setChecked(listState.get(position).isSelected()); 
     isFromView = false; 

     if ((position == 0)) { 
      holder.mCheckBox.setVisibility(View.INVISIBLE); 
     } else { 
      holder.mCheckBox.setVisibility(View.VISIBLE); 
     } 
     holder.mCheckBox.setTag(position); 
     holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       int getPosition = (Integer) buttonView.getTag(); 


      } 
     }); 
     return convertView; 
    } 

    private class ViewHolder { 
     private TextView mTextView; 
     private CheckBox mCheckBox; 
    } 
} 

Output:

enter image description here

+0

cảm ơn bạn rất nhiều – 1234abcd

+0

@ 1234abcd vui lòng giúp bạn. – Ironman

+0

@ 1234abcd 'Accept Answer' và' upvote' sẽ là 'favour'. – Ironman

Các vấn đề liên quan