我的 Android 应用程序中有一个微调器,它的onItemSelected()
事件会在进入活动时自动触发。
我该如何避免这种情况?
我们可以使用一个标志,并在真正触摸到微调器时启用它。
private boolean isSpinnerTouched = false;
spinner.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
isSpinnerTouched = true;
return false;
}
});
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapter, View arg1,
int arg2, long arg3) {
if (!isSpinnerTouched) return;
// do what you want
}
});
要添加 Jerry Abraham,您应该在启用 setOnItemSelectedListener 之前清除选择
Spinner mSpinner=(Spinner)findViewById(R.id.mySpinner);
int initialSelectedPosition=mSpinner.getSelectedItemPosition();
mSpinner.setSelection(initialSelectedPosition, false); //clear selection
mSpinner.setOnItemSelectedListener(this); //set listener after clearing section
我已经解决了这个问题,您可以通过不对微调器设置任何默认值来避免这个问题
int initialposition=spinner.getSelectedItemPosition();
spinner.setSelection(initialposition, false);
这将避免进入 onItemSelected()
没有任何方法可以避免这种情况。
您可以添加一些标志,表明您的应用程序已准备就绪,并在您的 onItemSelected() 方法中使用它来决定在每种情况下要做什么。
好吧,您可以向初始适配器添加一个虚拟选择,并忽略setOnItemSelectedListener
. 它不漂亮,但它有效。请参阅此代码以设置阵列适配器的项目。
List<String> names = new ArrayList<String>();
names.add("");
names.addAll(realValues);
然后在你的setOnItemSelectedListener
你可以这样做:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
if (position > 0)
{
String name = names.get(position - 1);
}
else
{
Log.d(TAG, "selected nothing or perhaps the dummy value");
}
}
我找到了解决此问题的方法并将其发布在此处(带有代码示例):
这很简单……用布尔值验证是否是第一次……
Spinner mySpinner = (Spinner)findViewById(R.id.spinner_xml_pro);
mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
if(isSpinnerInitial){ // globar var boolean isSpinnerInitial = false;
//do something
}else
isSpinnerInitial=true;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
我认为您可以使用微调器位置,在我看来这是一种更好的方法。创建一个存储微调器位置的全局变量,在 onItemSelected 方法中提供位置,您可以比较它们,如果它们相同,则不要执行操作。
private int spinnerPosition; \\ Global variable
mySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
if(spinnerPosition != position){
// Do whatever you like
// Do not forget to save the new position
spinnerPosition = position;
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});
您可以通过忽略第一次点击来避免它,
private boolean isSpinnerInitial = true; //As global variable
public void onItemSelected(xxx xxx, xxx xxx, xxx xxx, xxx xxx) {
if(isSpinnerInitial) {
isSpinnerInitial = false;
return;
}
// Write your code here
}