似乎微调器的大小与其适配器中给出的最长项目相同。在大多数情况下,这是一个很好的行为,但在我的特定情况下是不可取的。
这可以关闭吗?通过查看源代码中的 Spinner.onMeasure(),我的猜测是否定的,但我想我会问。
似乎微调器的大小与其适配器中给出的最长项目相同。在大多数情况下,这是一个很好的行为,但在我的特定情况下是不可取的。
这可以关闭吗?通过查看源代码中的 Spinner.onMeasure(),我的猜测是否定的,但我想我会问。
我现在通过子类化 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;
}
这对我有用。重要的部分是这个。把上面的代码放在你的适配器上,并使用 selectedItemPosition 从对象数组中选择文本。
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
如果有人正在寻找 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
}
}
像在 XML/JAVA/Kotlin 代码中使用DynamicSizeSpinner
默认值一样使用。Spinner
PS不要忘记阅读原文。
如果您只想让 Spinner 更短,这是一个简单的解决方法。
通常,您可以通过给它一个权重或设置它的 layout_width 和 layout_height 来更改任何视图的高度和宽度:
<Spinner
android:id="@+id/shortenedSpinner"
android:layout_width="100dp"
android:layout_height="50dp" />
这将迫使微调器更短
如果您希望下拉视图更短,那就不同了。在这种情况下,我想您可以在微调器适配器的 getDropDownView() 方法中提供一个自定义行,该方法具有与上述相同的更改。
这是更优雅的几乎单线解决方案:
class ResizingArrayAdapter<T>(context: Context, @LayoutRes layoutResId: Int, @IdRes textViewResourceId: Int, objects: List<T>) :
ArrayAdapter<T>(context, layoutResId, textViewResourceId, objects) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
super.getView(if (parent is AdapterView<*>) parent.selectedItemPosition else position, convertView, parent)
}