Java Android spinner“;onclicklistener";问题

Java Android spinner“;onclicklistener";问题,java,android,Java,Android,我正在使用微调器、游标和适配器 我想为微调器设置一个单击侦听器,这样一旦用户从微调器中选择一个项目,它就会得到当前选定的项目,然后执行一些其他任务(所有这些额外的代码都很好,这只是我遇到的一个问题)。。。。但是,它可以正常工作,一旦我声明setOnItemSelectedListener回调,因为光标已经填充,一旦应用启动,事件就会被触发 我想我需要一种在不选择初始项的情况下定义光标的方法,这样事件就不会触发(因为不会选择项)。还是有其他更好的方法来实现这一点 基本上,从目前的情况来看,一旦应用

我正在使用微调器、游标和适配器

我想为微调器设置一个单击侦听器,这样一旦用户从微调器中选择一个项目,它就会得到当前选定的项目,然后执行一些其他任务(所有这些额外的代码都很好,这只是我遇到的一个问题)。。。。但是,它可以正常工作,一旦我声明setOnItemSelectedListener回调,因为光标已经填充,一旦应用启动,事件就会被触发

我想我需要一种在不选择初始项的情况下定义光标的方法,这样事件就不会触发(因为不会选择项)。还是有其他更好的方法来实现这一点

基本上,从目前的情况来看,一旦应用程序加载setOnItemSelectedListener函数,它就会启动,因为光标正在填充(我想)。此外,忽略事件触发过快的事实,如果我在微调器中选择-same-项,它不会触发事件,因为该项没有更改。我应该使用不同的回调而不是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();
        }
    };

}

它解决了我的一个问题,即在定义回调后触发事件的问题,但是仍然存在问题