6

似乎微调器的大小与其适配器中给出的最长项目相同。在大多数情况下,这是一个很好的行为,但在我的特定情况下是不可取的。

这可以关闭吗?通过查看源代码中的 Spinner.onMeasure(),我的猜测是否定的,但我想我会问。

4

5 回答 5

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;
    }
于 2012-11-01T07:52:54.550 回答
1

这对我有用。重要的部分是这个。把上面的代码放在你的适配器上,并使用 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

于 2016-02-07T08:13:24.413 回答
1

如果有人正在寻找 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不要忘记阅读原文

于 2021-08-05T08:51:41.213 回答
0

如果您只想让 Spinner 更短,这是一个简单的解决方法。

通常,您可以通过给它一个权重或设置它的 layout_width 和 layout_height 来更改任何视图的高度和宽度:

<Spinner
    android:id="@+id/shortenedSpinner"
    android:layout_width="100dp"
    android:layout_height="50dp" />

这将迫使微调器更短

如果您希望下拉视图更短,那就不同了。在这种情况下,我想您可以在微调器适配器的 getDropDownView() 方法中提供一个自定义行,该方法具有与上述相同的更改。

于 2012-11-01T03:05:07.323 回答
0

这是更优雅的几乎单线解决方案:

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)
}
于 2022-02-09T10:55:34.830 回答