android微调器下拉框
我有这样的android微调器下拉框,android,drop-down-menu,textview,android-spinner,android-checkbox,Android,Drop Down Menu,Textview,Android Spinner,Android Checkbox,我有这样的Spinner: <Spinner android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/spinner1" android:background="@drawable/spinner_bg" an
Spinner
:
<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"/>
这是spinner\u 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>
<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"/>
<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"/>
<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" />
这是我自定义微调器的代码:
ArrayAdapter<ClassId> adapter = new ArrayAdapter<ClassId>(getActivity(),
R.layout.list_id, idList);
adapter.setDropDownViewResource(R.layout.list_id_select);
ArrayAdapter=新的ArrayAdapter(getActivity(),
R.layout.list_id,idList);
adapter.setDropDownViewResource(R.layout.list\u id\u select);
这是列表id.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>
<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"/>
<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"/>
<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" />
这是list\u id\u select.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>
<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"/>
<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"/>
<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" />
这是custom_checkbox.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>
<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"/>
<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"/>
<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" />
这是我在“微调器”下拉列表中显示的结果:
___________________________________________________________________________复选框 ____文本uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
表示文本和复选框不一致(复选框高于文本)。
如何修复它?为此,您必须创建
自定义适配器
,并在下面的方法中设置文本视图
和复选框
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);
在xml中定义微调器
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp" />
现在创建StateVO.java
类,该类可以包含TextView
和CheckBox
值
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;
}
}
现在,在您的活动中
初始化微调器
,并按下面的方式设置自定义适配器
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);
输出:
这篇文章是一个很好的资源。对于任何感兴趣的人,我根据另一个答案制作了一个通用适配器,它对多种数据类型都很有效。还允许您单击文本以切换复选框
public class CheckableSpinnerAdapter<T> extends BaseAdapter {
static class SpinnerItem<T> {
private String txt;
private T item;
SpinnerItem(T t, String s) {
item = t;
txt = s;
}
}
private Context context;
private Set<T> selected_items;
private List<SpinnerItem<T>> all_items;
private String headerText;
CheckableSpinnerAdapter(Context context,
String headerText,
List<SpinnerItem<T>> all_items,
Set<T> selected_items) {
this.context = context;
this.headerText = headerText;
this.all_items = all_items;
this.selected_items = selected_items;
}
@Override
public int getCount() {
return all_items.size() + 1;
}
@Override
public Object getItem(int position) {
if( position < 1 ) {
return null;
}
else {
return all_items.get(position-1);
}
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
@SuppressWarnings({"unchecked"})
@NonNull
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
final ViewHolder holder;
if (convertView == null ) {
LayoutInflater layoutInflator = LayoutInflater.from(context);
convertView = layoutInflator.inflate(R.layout.checkable_spinner_item, parent, false);
holder = new ViewHolder();
holder.mTextView = convertView.findViewById(R.id.text);
holder.mCheckBox = convertView.findViewById(R.id.checkbox);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
if( position < 1 ) {
holder.mCheckBox.setVisibility(View.GONE);
holder.mTextView.setText(headerText);
}
else {
final int listPos = position - 1;
holder.mCheckBox.setVisibility(View.VISIBLE);
holder.mTextView.setText(all_items.get(listPos).txt);
final T item = all_items.get(listPos).item;
boolean isSel = selected_items.contains(item);
holder.mCheckBox.setOnCheckedChangeListener(null);
holder.mCheckBox.setChecked(isSel);
holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if( isChecked ) {
selected_items.add(item);
}
else {
selected_items.remove(item);
}
}
});
holder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.mCheckBox.toggle();
}
});
}
return convertView;
}
private class ViewHolder {
private TextView mTextView;
private CheckBox mCheckBox;
}
}
您可以通过创建要显示的项目列表、包含选定项目的集合和标题行文本来使用它。例如:
private final List<CheckableSpinnerAdapter.SpinnerItem<MyObject>> spinner_items = new ArrayList<>();
private final Set<MyObject> selected_items = new HashSet<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// fill the 'spinner_items' array with all items to show
List<MyObject> all_objects = getMyObjects(); // from wherever
for(MyObject o : all_objects) {
spinner_items.add(new CheckableSpinnerAdapter.SpinnerItem<>(o, o.getName()));
}
// to start with any pre-selected, add them to the `selected_items` set
String headerText = "Click an Item";
Spinner spinner = findViewById(R.id.my_spinner);
CheckableSpinnerAdapter adapter = new CheckableSpinnerAdapter<>(this, headerText, spinner_items, selected_items);
spinner.setAdapter(adapter);
// when you want to see what the user has selected, look in the `selected_items`
// set anywhere in your activity
}
我得到一个奇怪的行为,当我向下或向上滚动时,复选框转换为未选中。因此,每当复选框向上或向下(从视图中隐藏)时,它都会转换为未选中!!复选框功能正常工作,但选定值未添加到微调器上是否有方法为下拉列表提供偏移量,以便下拉列表从微调器下方开始,而不是在微调器顶部显示下拉列表?谢谢你可以发布你的MyObject类MyObject
可以是任何东西。对于这里的示例活动,它只需要有一个getName
函数,但您可以将其更改为您想要获得该对象微调器中显示的字符串的任何内容。我添加了一个简单的示例类。