setOnItemClickListener在Android Spinner中不起作用。

15

setOnItemClickListener在android Spinner上不起作用。 这是我的代码:

supplier.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
                    // TODO Auto-generated method stub

                    String msupplier=supplier.getSelectedItem().toString();
                    Log.e("Selected item : ",msupplier);

                }
            });

你能提供一些关于那个活动的更多代码吗? - Chirag Patel
请在问题中添加您的适配器代码和旋转器项目的XML。 - Mr.Me
8个回答

51

setOnItemClickListener方法无法与安卓Spinner一起使用。相反,请尝试使用以下方法:

setOnItemSelectedListener

将您的代码更改为以下内容:

supplier.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub
                String msupplier=supplier.getSelectedItem().toString();

                Log.e("Selected item : ",msupplier);
}

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });

7
Spinner 的问题在于只有在更改所选项目时才会收到通知,而如果点击相同的项目,则永远不会收到通知,因此需要一个 itemClicked 事件。 - Léon Pelletier

6

OnItemSelectedListener()的作用与点击监听器不同。最重要的是,如果再次点击当前选定的项目,它不会触发。在某些情况下,这可能不是问题,但在其他情况下,它可能是个大问题。因此,真正的解决方法不是告诉人们使用不同且可能不合适的监听器,而是解决原始问题。 :-)

幸运的是,我们可以将点击监听器放在适配器上:

public class SpinnerClickAdapter extends BaseAdapter implements SpinnerAdapter {
  protected OnItemClickListener listener;

  public SpinnerClickAdapter(Context context, ..., OnItemClickListener listener) {
    super();

    this.listener = listener;
  }

  @Override
  public View getDropDownView(final int position, View convertView, final ViewGroup parent) {
    if (convertView == null)
      convertView = LayoutInflater.from(context).inflate(R.layout.yourlayout, false);

    convertView.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (listener != null)
          listener.onItemClick((AdapterView<?>) parent, v, position, getItemId(position));
      }
    });


    // ...

    return convertView;
  }
}

然后我们可以像往常一样使用它,唯一的区别是不将其设置在Spinner上,而是设置在适配器上:

Spinner spinner = (Spinner) findViewById(R.id.yourspinner);
SpinnerClickAdapter spinnerAdapter = new SpinnerClickAdapter(context, ..., new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    // TODO
  }
});
spinner.setAdapter(spinnerAdapter);

1
你好,做得很好,但是如何在选择项目后折叠Spinner? - Erfan Eghterafi
@ErfanEghterafi 请查看此答案 - Xam

5

1. 我认为你应该检查包含spinner的xml文件。确保没有设置android:clickable = "false"

2. 请检查你的spinner适配器,并确保在你的getView(int position, View convertView, ViewGroup parent)方法中,你没有设置任何小部件的点击回调事件,例如ButtonImageviewTextView


4

我可能有些跑题,但建议您在下拉框中使用OnItemSelectedListener而不是OnItemClickListener,因为前者范围更广:

supplier.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
        long arg3) {
        //do something here
    }
    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        //optionally do something here
    }
});

1

我曾经遇到过这个问题。setOnItemClickListener不能与Spinner一起使用。我的解决方案如下:

mSpinnerYears.setAdapter(adapter);
    mSpinnerYears.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Logger.d(new StringBuilder(2).append("TAG:").append(TAG).toString(),
                    new StringBuilder(3).append("click pos = ").append(position).append(
                            mSpinnerYears.getItemAtPosition(position).toString()).toString());
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

1
使用getItemAtPosition:
supplier.getItemAtPosition(position).toString();

1
使用此代码。
supplier.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

0
我觉得你代码中的supplier应该是指spinner,请将这行代码替换掉。
 String msupplier=supplier.getSelectedItem().toString();

使用下面的代码行:

 String msupplier= supplier.getItemAtPosition(position).toString(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接