android 微调器中位置 0 的选定项目
Selected item at position 0 in android Spinner
我在微调器下拉菜单中显示第一项 selected 时遇到问题。首次初始化微调器时,行会填充 "nothing selected view",当从下拉菜单中输入 select 内容时,微调器视图将更改为下拉菜单中的 selected 值。这在所有情况下都有效,除了我 select 初始化后第一项的情况。我想说的是,微调器行的值在除 0 项之外的所有情况下都将 selected 项的值写入下拉列表中。仅当项目 0> 之前 selected 时,微调器中才会显示零项目。如果 0 在微调器初始化后立即被 selected,它不会显示。
这让我得出结论,适配器以奇怪的方式工作。
初始化微调器时,它会填充默认值。之后,如果 selected 项目高于默认值,它将更改该默认值,但如果默认值未更改,状态保持不变?换句话说,Spinner 只会在 selected 值与当前值不同的情况下更改视图?另一件困扰我的事情是,在 getView 方法中,我得到了正确的值和正确的位置,但视图无论如何都不会改变。就像某些东西覆盖覆盖方法并且如果值为 0 则不会让视图更改。
片段中的微调器
spinnerHairColor.setAdapter(new CustomSpinnerAdapter(R.string.hair_color,
getContext(), R.layout.spinner_dropdown, values.getHair_color()));
spinnerHairColor.setFocusableInTouchMode(true);
spinnerHairColor.setOnFocusChangeListener(spinnerFocusListener);
适配器
public class CustomSpinnerAdapter extends ArrayAdapter<Values.ValuesProperty> implements SpinnerAdapter {
private Context context;
private List<Values.ValuesProperty> valuesProperty;
protected LayoutInflater layoutInflater;
private int unselectedText;
private boolean init = false;
public CustomSpinnerAdapter(int unselectedText, Context context, int nothingSelectedLayout, List<Values.ValuesProperty> valuesProperty) {
super(context, nothingSelectedLayout, valuesProperty);
this.unselectedText = unselectedText;
this.valuesProperty = valuesProperty;
layoutInflater = LayoutInflater.from(context);
this.context=context;
init = true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false);
TextView tv = (TextView) row.findViewById(R.id.spinnerNothingText);
if (position == 0 && init) {
return getNothingSelectedView(parent);
}
Values.ValuesProperty v = getItem(position);
tv.setText(getContext().getText(unselectedText) + ": " + v.getName());
return row;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
Values.ValuesProperty v = getItem(position);
View row = layoutInflater.inflate(R.layout.item_spinner, parent, false);
TextView tv = (TextView) row.findViewById(R.id.spinnerText);
tv.setText(v.getName());
return row;
}
protected View getNothingSelectedView(ViewGroup parent)
{
View backView = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false);
TextView tv = (TextView) backView.findViewById(R.id.spinnerNothingText);
tv.setText(getContext().getText(unselectedText));
// to make sure if 0 is selected isnt inital 0
init = false;
return backView;
}
}
我想出了一个解决方案。这是适用于微调器的适配器,如果未选择任何内容,微调器可能具有默认值
public class CustomSpinnerAdapter extends ArrayAdapter<Values.ValuesProperty> implements SpinnerAdapter{
private Context context;
private List<Values.ValuesProperty> valuesProperty;
protected LayoutInflater layoutInflater;
private int unselectedText;
private boolean init = false;
public CustomSpinnerAdapter(int unselectedText, Context context, int nothingSelectedLayout,
List<Values.ValuesProperty> valuesProperty) {
super(context, nothingSelectedLayout, valuesProperty);
this.unselectedText = unselectedText;
this.valuesProperty = valuesProperty;
layoutInflater = LayoutInflater.from(context);
this.context = context;
init = true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false);
TextView tv = (TextView) row.findViewById(R.id.spinnerNothingText);
if (position == 0 && init) {
init = false;
tv.setText(getContext().getText(unselectedText));
return row;
}
Values.ValuesProperty v = getItem(position);
if (position == 0 && parent.hasFocus())
notifyDataSetChanged();
tv.setText(getContext().getText(unselectedText) + ": " + v.getName());
return row;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
Values.ValuesProperty v = getItem(position);
View rowDrop = layoutInflater.inflate(R.layout.item_spinner, parent, false);
TextView tvDrop = (TextView) rowDrop.findViewById(R.id.spinnerText);
tvDrop.setText(v.getName());
return rowDrop;
}
}
我在微调器下拉菜单中显示第一项 selected 时遇到问题。首次初始化微调器时,行会填充 "nothing selected view",当从下拉菜单中输入 select 内容时,微调器视图将更改为下拉菜单中的 selected 值。这在所有情况下都有效,除了我 select 初始化后第一项的情况。我想说的是,微调器行的值在除 0 项之外的所有情况下都将 selected 项的值写入下拉列表中。仅当项目 0> 之前 selected 时,微调器中才会显示零项目。如果 0 在微调器初始化后立即被 selected,它不会显示。
这让我得出结论,适配器以奇怪的方式工作。 初始化微调器时,它会填充默认值。之后,如果 selected 项目高于默认值,它将更改该默认值,但如果默认值未更改,状态保持不变?换句话说,Spinner 只会在 selected 值与当前值不同的情况下更改视图?另一件困扰我的事情是,在 getView 方法中,我得到了正确的值和正确的位置,但视图无论如何都不会改变。就像某些东西覆盖覆盖方法并且如果值为 0 则不会让视图更改。
片段中的微调器
spinnerHairColor.setAdapter(new CustomSpinnerAdapter(R.string.hair_color,
getContext(), R.layout.spinner_dropdown, values.getHair_color()));
spinnerHairColor.setFocusableInTouchMode(true);
spinnerHairColor.setOnFocusChangeListener(spinnerFocusListener);
适配器
public class CustomSpinnerAdapter extends ArrayAdapter<Values.ValuesProperty> implements SpinnerAdapter {
private Context context;
private List<Values.ValuesProperty> valuesProperty;
protected LayoutInflater layoutInflater;
private int unselectedText;
private boolean init = false;
public CustomSpinnerAdapter(int unselectedText, Context context, int nothingSelectedLayout, List<Values.ValuesProperty> valuesProperty) {
super(context, nothingSelectedLayout, valuesProperty);
this.unselectedText = unselectedText;
this.valuesProperty = valuesProperty;
layoutInflater = LayoutInflater.from(context);
this.context=context;
init = true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false);
TextView tv = (TextView) row.findViewById(R.id.spinnerNothingText);
if (position == 0 && init) {
return getNothingSelectedView(parent);
}
Values.ValuesProperty v = getItem(position);
tv.setText(getContext().getText(unselectedText) + ": " + v.getName());
return row;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
Values.ValuesProperty v = getItem(position);
View row = layoutInflater.inflate(R.layout.item_spinner, parent, false);
TextView tv = (TextView) row.findViewById(R.id.spinnerText);
tv.setText(v.getName());
return row;
}
protected View getNothingSelectedView(ViewGroup parent)
{
View backView = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false);
TextView tv = (TextView) backView.findViewById(R.id.spinnerNothingText);
tv.setText(getContext().getText(unselectedText));
// to make sure if 0 is selected isnt inital 0
init = false;
return backView;
}
}
我想出了一个解决方案。这是适用于微调器的适配器,如果未选择任何内容,微调器可能具有默认值
public class CustomSpinnerAdapter extends ArrayAdapter<Values.ValuesProperty> implements SpinnerAdapter{
private Context context;
private List<Values.ValuesProperty> valuesProperty;
protected LayoutInflater layoutInflater;
private int unselectedText;
private boolean init = false;
public CustomSpinnerAdapter(int unselectedText, Context context, int nothingSelectedLayout,
List<Values.ValuesProperty> valuesProperty) {
super(context, nothingSelectedLayout, valuesProperty);
this.unselectedText = unselectedText;
this.valuesProperty = valuesProperty;
layoutInflater = LayoutInflater.from(context);
this.context = context;
init = true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = layoutInflater.inflate(R.layout.spinner_dropdown, parent, false);
TextView tv = (TextView) row.findViewById(R.id.spinnerNothingText);
if (position == 0 && init) {
init = false;
tv.setText(getContext().getText(unselectedText));
return row;
}
Values.ValuesProperty v = getItem(position);
if (position == 0 && parent.hasFocus())
notifyDataSetChanged();
tv.setText(getContext().getText(unselectedText) + ": " + v.getName());
return row;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
Values.ValuesProperty v = getItem(position);
View rowDrop = layoutInflater.inflate(R.layout.item_spinner, parent, false);
TextView tvDrop = (TextView) rowDrop.findViewById(R.id.spinnerText);
tvDrop.setText(v.getName());
return rowDrop;
}
}