Android 为什么只在项目更改时调用OnItemSelectedListener,而不是在每个用户选择上调用?
我在Android应用程序中使用微调器控件,并通过Android 为什么只在项目更改时调用OnItemSelectedListener,而不是在每个用户选择上调用?,android,android-spinner,Android,Android Spinner,我在Android应用程序中使用微调器控件,并通过onItemSelectedListener()方法处理用户选择。当做出与当前选择不同的选择时,这似乎可以正常工作。我希望在某些条件下将所有微调器重置为默认值,并确保为所有微调器调用onItemSelectedListener() spinner.setAdapter(adapter); } 只有当用户选择发生变化时才会调用onItemSelectedListener(),这是Android语义的一部分吗。有没有办法强制调用onItem
onItemSelectedListener()
方法处理用户选择。当做出与当前选择不同的选择时,这似乎可以正常工作。我希望在某些条件下将所有微调器重置为默认值,并确保为所有微调器调用onItemSelectedListener()
spinner.setAdapter(adapter);
}
只有当用户选择发生变化时才会调用
onItemSelectedListener()
,这是Android语义的一部分吗。有没有办法强制调用onItemSelectedListener()
?当您选择与当前所选项目相同的项目时,默认微调器不会触发任何事件。您需要制作一个自定义微调器才能执行此操作。如果希望触发微调器的“onItemSelected”(已选中微调器中的项目),请参见。
spinner.setAdapter(adapter);
}
然后使用这个扩展spinner的自定义类,这对我很有用
spinner.setAdapter(adapter);
}
然后像这样用微调器编辑你的活动,我改变了
static Spinner spinner1;
spinner.setAdapter(adapter);
}
到
spinner.setAdapter(adapter);
}
及
spinner.setAdapter(adapter);
}
到
spinner.setAdapter(adapter);
}
我还更改了微调器所在的xml布局
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/place" />
spinner.setAdapter(adapter);
}
到
spinner.setAdapter(adapter);
}
微调器扩展类:
package com.yourpackagename;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.Spinner;
import android.widget.Toast;
import java.lang.reflect.Field;
/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value.
* ie This is extended "Customized class of Spinner" to get the "onItemSelected" event even if the item in the
* Spinner is already selected by the user*/
public class NDSpinner extends Spinner {
public NDSpinner(Context context)
{ super(context); }
public NDSpinner(Context context, AttributeSet attrs)
{ super(context, attrs); }
public NDSpinner(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }
private void ignoreOldSelectionByReflection() {
try {
Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
Field reqField = c.getDeclaredField("mOldSelectedPosition");
reqField.setAccessible(true);
reqField.setInt(this, -1);
} catch (Exception e) {
Log.d("Exception Private", "ex", e);
// TODO: handle exception
}
}
@Override
public void setSelection(int position, boolean animate)
{
boolean sameSelected = position == getSelectedItemPosition();
ignoreOldSelectionByReflection();
super.setSelection(position, animate);
if (sameSelected) {
// Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
}
}
@Override
public void setSelection(int position) {
ignoreOldSelectionByReflection();
super.setSelection(position);
}
}
spinner.setAdapter(adapter);
}
package com.yourpackagename;
导入android.content.Context;
导入android.util.AttributeSet;
导入android.util.Log;
导入android.widget.Spinner;
导入android.widget.Toast;
导入java.lang.reflect.Field;
/**微调器扩展名,即使选择与以前的值相同,也会调用onItemSelected。
*ie扩展了“自定义微调器类”以获得“onItemSelected”事件,即使
*微调器已由用户选择*/
公共类NDSpinner扩展了Spinner{
公共NDSpinner(上下文)
{super(context);}
公共NDSpinner(上下文、属性集属性)
{super(context,attrs);}
公共NDSpinner(上下文、属性集属性、int-defStyle)
{super(context,attrs,defStyle);}
private void ignoreOldSelectionByReflection(){
试一试{
c类=this.getClass().getSuperclass().getSuperclass().getSuperclass();
Field reqField=c.getDeclaredField(“模具选择位置”);
reqField.setAccessible(真);
reqField.setInt(此为-1);
}捕获(例外e){
日志d(“私人例外”、“例外情况”,e);
//TODO:处理异常
}
}
@凌驾
公共无效设置选择(整型位置,布尔动画)
{
布尔sameSelected=position==getSelectedItemPosition();
ignoreOldSelectionByReflection();
super.setSelection(位置、动画);
如果(相同选择){
//如果选择了同一项,微调器不会调用OnItemSelectedListener,因此现在手动执行
getOnItemSelectedListener().onItemSelected(此,getSelectedView(),位置,getSelectedItemId());
}
}
@凌驾
公共选举(内部职位){
ignoreOldSelectionByReflection();
超级选举(职位);
}
}
如果要使用默认微调器每次添加相同的适配器:
spinner.setAdapter(adapter);
}
@凌驾
已选择公共位置(适配器视图适配器,视图v,内部位置,长lng){
spinner.setAdapter(adapter);
}
等等,您描述的与微调器的工作方式相反。当您使用OnItemClickListener时,微调器会引发RuntimeException,并且无论用户是重新选择了以前的选择还是做出了新的选择,都会调用OnItemSelectedListener…感谢您的反馈,我拼错了。我使用的是OnItemSelectedListener().我现在已编辑了我的邮件。