1

我必须写一个@BindingAdapter接受 Spinner 和EnumSet<T>

@BindingAdapter(value = {"android:entries"})
public static <T extends Enum<T> & ITextable> void bindSpinnerData(Spinner spinner, EnumSet<T> entries) {
    spinner.setAdapter(new ArrayAdapter<T>(spinner.getContext(), R.layout.support_simple_spinner_dropdown_item, new ArrayList<>(entries)) {
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            View v = super.getView(position, convertView, parent);
            TextView textView = (TextView) v.findViewById(android.R.id.text1);
            ITextable item = getItem(position);
            textView.setText(item.getText());
            return v;
        }

        @Override
        public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            View v = super.getDropDownView(position, convertView, parent);
            TextView textView = (TextView) v.findViewById(android.R.id.text1);
            ITextable item = getItem(position);
            textView.setText(item.getText());
            return v;
        }
    });
}

我有一个问题,因为如果Spinner项目的文本太长而无法放入一行,则文本不会被换行而是像这样被切断:

在此处输入图像描述

谁能告诉我应该在哪里以及我应该改变什么来换行?

4

1 回答 1

1

这实际上不是数据绑定问题。这是因为 TextView 没有默认包装,如果你不设置它们也没有省略号。

您可能想尝试创建自己的膨胀布局,或者您可以使用

textView.setSingleLine(false)
textView.setMaxLines(2)

如果这不起作用,您需要覆盖getDropDownView

@Override
public View getDropDownView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = new TextView(_context);
    }

    TextView item = (TextView) convertView;
    item.setText(yourItems.getItem(position));
    final TextView finalItem = item;
    item.post(new Runnable() {
        @Override
        public void run() {
            finalItem.setSingleLine(false);
        }
    });
    return item;
}

最简单的解决方案是通过将其放入您的 xml 中,使用对话框设计来切换您的 Spinner。

 <Spinner android:spinnerMode="dialog" />
于 2017-08-29T11:19:51.227 回答