【问题标题】:Convert Simple Multiple Selection Spinner to Custom Multiple Selection Spinner将简单多选微调器转换为自定义多选微调器
【发布时间】:2014-10-14 09:33:24
【问题描述】:

我创建了一个Multiple Selection Spinner 示例。它工作正常。但现在我想自定义 Spinner 行。不知道怎么改

new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item)

我需要定制:

  • 背景颜色
  • 复选框背景
  • 文字颜色

我该怎么办?非常感谢

public class MultiSelectionSpinner extends Spinner implements OnMultiChoiceClickListener {  
String[] _items = null;  
boolean[] mSelection = null;  

ArrayAdapter<String> simple_adapter;  

public MultiSelectionSpinner(Context context) {  
    super(context);  

    simple_adapter = new ArrayAdapter<String>(context,  
            android.R.layout.simple_spinner_item);  
    super.setAdapter(simple_adapter);  
}  

public MultiSelectionSpinner(Context context, AttributeSet attrs) {  
    super(context, attrs);  

    simple_adapter = new ArrayAdapter<String>(context,  
            android.R.layout.simple_spinner_item);  
    super.setAdapter(simple_adapter);  
}  

public void onClick(DialogInterface dialog, int which, boolean isChecked) {  
    if (mSelection != null && which < mSelection.length) {  
        mSelection[which] = isChecked;  

        simple_adapter.clear();  
        simple_adapter.add(buildSelectedItemString());  
    } else {  
        throw new IllegalArgumentException(  
                "Argument 'which' is out of bounds.");  
    }  
}  

@Override  
public boolean performClick() {  
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());  
    builder.setMultiChoiceItems(_items, mSelection, this);  
    builder.show();  
    return true;  
}  

@Override  
public void setAdapter(SpinnerAdapter adapter) {  
    throw new RuntimeException(  
            "setAdapter is not supported by MultiSelectSpinner.");  
}  

public void setItems(String[] items) {  
    _items = items;  
    mSelection = new boolean[_items.length];  
    simple_adapter.clear();  
    simple_adapter.add(_items[0]);  
    Arrays.fill(mSelection, false);  
}  

public void setItems(List<String> items) {  
    _items = items.toArray(new String[items.size()]);  
    mSelection = new boolean[_items.length];  
    simple_adapter.clear();  
    simple_adapter.add(_items[0]);  
    Arrays.fill(mSelection, false);  
}  

public void setSelection(String[] selection) {  
    for (String cell : selection) {  
        for (int j = 0; j < _items.length; ++j) {  
            if (_items[j].equals(cell)) {  
                mSelection[j] = true;  
            }  
        }  
    }  
}  

public void setSelection(List<String> selection) {  
    for (int i = 0; i < mSelection.length; i++) {  
        mSelection[i] = false;  
    }  
    for (String sel : selection) {  
        for (int j = 0; j < _items.length; ++j) {  
            if (_items[j].equals(sel)) {  
                mSelection[j] = true;  
            }  
        }  
    }  
    simple_adapter.clear();  
    simple_adapter.add(buildSelectedItemString());  
}  

public void setSelection(int index) {  
    for (int i = 0; i < mSelection.length; i++) {  
        mSelection[i] = false;  
    }  
    if (index >= 0 && index < mSelection.length) {  
        mSelection[index] = true;  
    } else {  
        throw new IllegalArgumentException("Index " + index  
                + " is out of bounds.");  
    }  
    simple_adapter.clear();  
    simple_adapter.add(buildSelectedItemString());  
}  

public void setSelection(int[] selectedIndicies) {  
    for (int i = 0; i < mSelection.length; i++) {  
        mSelection[i] = false;  
    }  
    for (int index : selectedIndicies) {  
        if (index >= 0 && index < mSelection.length) {  
            mSelection[index] = true;  
        } else {  
            throw new IllegalArgumentException("Index " + index  
                    + " is out of bounds.");  
        }     
    }  
    simple_adapter.clear();  
    simple_adapter.add(buildSelectedItemString());  
}  

public List<String> getSelectedStrings() {  
    List<String> selection = new LinkedList<String>();  
    for (int i = 0; i < _items.length; ++i) {  
        if (mSelection[i]) {  
            selection.add(_items[i]);  
        }  
    }  
    return selection;  
}  

public List<Integer> getSelectedIndicies() {  
    List<Integer> selection = new LinkedList<Integer>();  
    for (int i = 0; i < _items.length; ++i) {  
        if (mSelection[i]) {  
            selection.add(i);  
        }  
    }  
    return selection;  
}  

private String buildSelectedItemString() {  
    StringBuilder sb = new StringBuilder();  
    boolean foundOne = false;  

    for (int i = 0; i < _items.length; ++i) {  
        if (mSelection[i]) {  
            if (foundOne) {  
                sb.append(", ");  
            }  
            foundOne = true;  

            sb.append(_items[i]);  
        }  
    }  
    return sb.toString();  
}  

public String getSelectedItemsAsString() {  
    StringBuilder sb = new StringBuilder();  
    boolean foundOne = false;  

    for (int i = 0; i < _items.length; ++i) {  
        if (mSelection[i]) {  
            if (foundOne) {  
                sb.append(", ");  
            }  
            foundOne = true;  
            sb.append(_items[i]);  
        }  
    }  
    return sb.toString();  
}  
}  

【问题讨论】:

    标签: android spinner customization multipleselection


    【解决方案1】:
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
                             context, 
                             android.R.layout.simple_list_item_multiple_choice){
                        @Override
                        public View getView(int position, View convertView,
                                ViewGroup parent) {
                            View view =super.getView(position, convertView, parent);
    
                            CheckedTextView textView=(CheckedTextView) view.findViewById(android.R.id.text1);
    
                            textView.setCheckMarkDrawable(0);                       
                            textView.setCompoundDrawablesWithIntrinsicBounds (0, 0,R.drawable.checkbox_selector ,0);
                            textView.setTextColor(getResources().getColor(R.color.YOUR_COLOR));
                            //set background color for view
                            return view;
                        }
                    };
    

    drawable-->checkbox_selector.xml

     <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
         <item android:drawable="@drawable/CHECKEDIMAGE" android:state_checked="true"/>
            <item android:drawable="@drawable/CHECKEDIMAGE" android:state_focused="true"/>
            <item android:drawable="@drawable/UNCHECKEDIMAGE"/>
    
        </selector>
    

    【讨论】:

    • 以及自定义其他组件?
    • 1. 使用视图设置背景颜色 2. 使用 textview 设置文本颜色 3. 使用 textview.setCompoundDrawablesWithIntrinsicBounds() 自定义复选框
    • 我需要更改下拉视图中的微调器行。您的代码更改微调器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多