Java Android spinner“;onclicklistener";问题
我正在使用微调器、游标和适配器 我想为微调器设置一个单击侦听器,这样一旦用户从微调器中选择一个项目,它就会得到当前选定的项目,然后执行一些其他任务(所有这些额外的代码都很好,这只是我遇到的一个问题)。。。。但是,它可以正常工作,一旦我声明setOnItemSelectedListener回调,因为光标已经填充,一旦应用启动,事件就会被触发 我想我需要一种在不选择初始项的情况下定义光标的方法,这样事件就不会触发(因为不会选择项)。还是有其他更好的方法来实现这一点 基本上,从目前的情况来看,一旦应用程序加载setOnItemSelectedListener函数,它就会启动,因为光标正在填充(我想)。此外,忽略事件触发过快的事实,如果我在微调器中选择-same-项,它不会触发事件,因为该项没有更改。我应该使用不同的回调而不是SetOnItemSelectedListener吗?这是我到目前为止的代码Java Android spinner“;onclicklistener";问题,java,android,Java,Android,我正在使用微调器、游标和适配器 我想为微调器设置一个单击侦听器,这样一旦用户从微调器中选择一个项目,它就会得到当前选定的项目,然后执行一些其他任务(所有这些额外的代码都很好,这只是我遇到的一个问题)。。。。但是,它可以正常工作,一旦我声明setOnItemSelectedListener回调,因为光标已经填充,一旦应用启动,事件就会被触发 我想我需要一种在不选择初始项的情况下定义光标的方法,这样事件就不会触发(因为不会选择项)。还是有其他更好的方法来实现这一点 基本上,从目前的情况来看,一旦应用
c = db.getallrecents();
startManagingCursor(c);
busnumspinner = (Spinner) findViewById(R.id.Spinner01);
SimpleCursorAdapter spinneradapter = new SimpleCursorAdapter(this,
R.layout.lvlayout, c, spincol, spinto);
busnumspinner.setAdapter(spinneradapter);
busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
String spinnerString = null;
Cursor cc = (Cursor)(busnumspinner.getSelectedItem());
if (cc != null) {
spinnerString = cc.getString(
cc.getColumnIndex("busnum"));
text = spinnerString;
}
showDialog(DATE_DIALOG_ID);
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
c=db.getallrecents();
开始管理光标(c);
busnumspinner=(微调器)findViewById(R.id.Spinner01);
SimpleCrsorAdapter spinneradapter=新的SimpleCrsorAdapter(此,
R.layout.lvlayout,c,spincol,spinto);
busnumspinner.setAdapter(spinneradapter);
setOnItemSelectedListener(新的OnItemSelectedListener()){
@凌驾
已选择公共视图(AdapterView父视图、视图selectedItemView、整型位置、长id){
字符串喷丝头String=null;
游标cc=(游标)(busnumspinner.getSelectedItem());
如果(cc!=null){
spinnerString=cc.getString(
抄送getColumnIndex(“busnum”);
文本=喷丝头字符串;
}
showDialog(日期对话框ID);
}
@凌驾
未选择公共无效(AdapterView父视图){
//你的代码在这里
}
});
使用布尔标志忽略系统第一次选择它时,这不是一个很好的解决方案,但我已经为此奋斗了好几次,从未找到更好的解决方案。使用布尔标志忽略系统第一次选择它时,这不是一个很好的解决方案,但是我已经为此挣扎了好几次,并且没有找到更好的解决方案。这篇文章已经讨论过了。看这里,虽然它有一个类似于blindstuff给出的答案
编辑:
如果onItemSelectedListener在需要时未启动,则可能需要在droplist的每个文本项中使用onClickListener,并在其中获取微调器选定项的当前位置。问题是,正如所说,spinner不支持此事件,但也许您可以通过执行类似于本文所述的操作来获得它。我还没有试过,所以我不确定它是否会起作用。这篇文章已经讨论过了。看这里,虽然它有一个类似于blindstuff给出的答案 编辑:
如果onItemSelectedListener在需要时未启动,则可能需要在droplist的每个文本项中使用onClickListener,并在其中获取微调器选定项的当前位置。问题是,正如所说,spinner不支持此事件,但也许您可以通过执行类似于本文所述的操作来获得它。我还没有尝试过,所以我不确定它是否会工作。您可以添加微调器的第一项默认值,如selectvalues,并检查其在选定侦听器中的位置,如果它是零位置,则不要在循环中输入大于0的值,然后在方法中输入 参见示例
busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int
position, long id) {
if(position!=0)
{
String spinnerString = null;
Cursor cc = (Cursor)(busnumspinner.getSelectedItem());
if (cc != null) {
spinnerString = cc.getString(
cc.getColumnIndex("busnum"));
text = spinnerString;
}
}
So this is not run the default value
busnumspinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、View selectedItemView、int
位置(长id){
如果(位置!=0)
{
字符串喷丝头String=null;
游标cc=(游标)(busnumspinner.getSelectedItem());
如果(cc!=null){
spinnerString=cc.getString(
抄送getColumnIndex(“busnum”);
文本=喷丝头字符串;
}
}
因此,这不是默认值
您可以添加微调器的第一项默认值,如selectvalues,并检查其在onitemselected listener中的位置,如果是零位置,则不要在循环中输入大于0的值,然后在方法中输入
参见示例
busnumspinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int
position, long id) {
if(position!=0)
{
String spinnerString = null;
Cursor cc = (Cursor)(busnumspinner.getSelectedItem());
if (cc != null) {
spinnerString = cc.getString(
cc.getColumnIndex("busnum"));
text = spinnerString;
}
}
So this is not run the default value
busnumspinner.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、View selectedItemView、int
位置(长id){
如果(位置!=0)
{
字符串喷丝头String=null;
游标cc=(游标)(busnumspinner.getSelectedItem());
如果(cc!=null){
spinnerString=cc.getString(
抄送getColumnIndex(“busnum”);
文本=喷丝头字符串;
}
}
因此,这不是默认值
试试这个:
扩展SimpleCursorAdapter,覆盖bindView()并为行视图设置OnClickListener
这将克服这两个问题:您没有接到最初的呼叫,每次选择都会点击(包括重新选择)
如果您需要示例代码,请告诉我
编辑:代码示例:
protected class NoteAdapter extends SimpleCursorAdapter {
// Constructor
public NoteAdapter(Context context, Cursor c) {
super(context, R.layout.etb_items_strip_list_item, c, fromNote, toNote);
}
// This is where the actual binding of a cursor to view happens
@Override
public void bindView(View row, Context context, Cursor cursor) {
super.bindView(row, context, cursor);
// Save id
Long id = cursor.getLong(cursor.getColumnIndex("_id"));
row.setTag(id);
// Set callback
row.setOnClickListener(row_OnClick);
}
// Callback: Item Click
OnClickListener row_OnClick = new OnClickListener(){
public void onClick(View v) {
Long id = (Long) v.getTag();
}
};
}
试试这个:
扩展SimpleCursorAdapter,覆盖bindView()并为行视图设置OnClickListener
这将克服这两个问题:您没有接到最初的呼叫,每次选择都会点击(包括重新选择)
如果您需要示例代码,请告诉我
编辑:代码示例:
protected class NoteAdapter extends SimpleCursorAdapter {
// Constructor
public NoteAdapter(Context context, Cursor c) {
super(context, R.layout.etb_items_strip_list_item, c, fromNote, toNote);
}
// This is where the actual binding of a cursor to view happens
@Override
public void bindView(View row, Context context, Cursor cursor) {
super.bindView(row, context, cursor);
// Save id
Long id = cursor.getLong(cursor.getColumnIndex("_id"));
row.setTag(id);
// Set callback
row.setOnClickListener(row_OnClick);
}
// Callback: Item Click
OnClickListener row_OnClick = new OnClickListener(){
public void onClick(View v) {
Long id = (Long) v.getTag();
}
};
}
它解决了我的一个问题,即在定义回调后触发事件的问题,但是仍然存在问题