Android 数据绑定旋转器适配器
Android data binding spinner adapter
我必须写一个 @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
项目的文本太长而无法放在一行中,文本不会换行而是像这样被切断:
任何人都可以告诉我在哪里以及我应该更改什么来换行文本吗?
这实际上不是数据绑定问题。这是因为默认情况下 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" />
我必须写一个 @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
项目的文本太长而无法放在一行中,文本不会换行而是像这样被切断:
任何人都可以告诉我在哪里以及我应该更改什么来换行文本吗?
这实际上不是数据绑定问题。这是因为默认情况下 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" />