似乎旋转器的大小适合其适配器中给出的最长项目。对于大多数情况来说,这是一种很好的行为,但在我的特定情况下这是不可取的。
这可以关闭吗?我的猜测不是,通过查看源代码中的Spinner.onMeasure(),但我想问。
答案 0 :(得分:4)
我现在通过继承Spinner来实现这一点:
public class SpinnerWrapContent extends IcsSpinner {
private boolean inOnMeasure;
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
inOnMeasure = true;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
inOnMeasure = false;
}
public boolean isInOnMeasure() {
return inOnMeasure;
}
}
然后在我的SpinnerAdapter的getView()中,如果从onMeasure()调用我,则使用当前选择的位置:
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView != null)
view = convertView;
else {
int fixedPosition = (spinner.isInOnMeasure() ? spinner.getSelectedItemPosition() : position);
// Here create view for fixedPosition
}
return view;
}
答案 1 :(得分:1)
这对我有用。重要的是这个。将上面的代码放在你的适配器上,并使用selectedItemPosition从objects数组中选择文本。
int selectedItemPosition = position;
if (parent instanceof AdapterView) {
selectedItemPosition = ((AdapterView) parent)
.getSelectedItemPosition();
}
示例如下。
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
final View spinnerCell;
if (convertView == null) {
// if it's not recycled, inflate it from layout
spinnerCell = inflater.inflate(R.layout.layout_spinner_cell, parent, false);
} else {
spinnerCell = convertView;
}
int selectedItemPosition = position;
if (parent instanceof AdapterView) {
selectedItemPosition = ((AdapterView) parent)
.getSelectedItemPosition();
}
TextView title = (TextView) spinnerCell.findViewById(R.id.spinnerTitle);
title.setText(titles[selectedItemPosition]);
return spinnerCell;
}
如果您需要说明,请点击此链接:http://coding-thoughts.blogspot.in/2013/11/help-my-spinner-is-too-wide.html
答案 2 :(得分:0)
如果你想让Spinner更短,那么这很容易解决。
通常,您可以通过赋予权重或设置layout_width和layout_height来更改任何视图的高度和宽度:
<Spinner
android:id="@+id/shortenedSpinner"
android:layout_width="100dp"
android:layout_height="50dp" />
这会强制微调器缩短
如果您希望下拉视图更短,那就不同了。 在这种情况下,我想你可以在微调器适配器的getDropDownView()方法中提供一个自定义行,它具有与上述相同的更改。
答案 3 :(得分:0)
如果有人正在寻找 Kotlin 的答案,请按以下方式操作。
class DynamicSizeSpinner : androidx.appcompat.widget.AppCompatSpinner {
var inOnMeasure = false
private set
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
inOnMeasure = true
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
inOnMeasure = false
}
}
class SpinnerArrayAdapter(context: Context,@LayoutRes layout: Int, val entries: List<String>) : ArrayAdapter<String>(context, layout, entries) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val selectedItemPosition = when (parent) {
is AdapterView<*> -> parent.selectedItemPosition
is DynamicSizeSpinner -> parent.selectedItemPosition
else -> position
}
return makeLayout(selectedItemPosition, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
return makeLayout(position, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
}
private fun makeLayout(position: Int, convertView: View?, parent: ViewGroup, layout: Int): View {
val view = convertView ?: LayoutInflater.from(context).inflate(layout, parent, false)
if (position != -1) {
(view as? TextView)?.text = entries[position]
}
return view
}
}
使用 DynamicSizeSpinner
,就像在 XML/JAVA/Kotlin 代码中使用默认 Spinner
一样。
P.S 不要忘记阅读original article。