【问题标题】:setOnItemClickListener doesn't work with Android SpinnersetOnItemClickListener 不适用于 Android Spinner
【发布时间】:2019-04-09 02:06:50
【问题描述】:

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);

                }
            });

【问题讨论】:

  • 您能提供更多该活动的代码吗?
  • 请将您的适配器代码和微调器项目的 xml 添加到问题中

标签: android spinner


【解决方案1】:

setOnItemClickListener 不适用于 android 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

            }
        });

【讨论】:

  • 微调器的问题是,只有在更改所选项目时才会收到通知,而在单击同一项目时永远不会收到通知,因此需要 itemClicked 事件。
【解决方案2】:

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) 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);

【讨论】:

  • 嗨,干得好,但是如何在项目选择后折叠微调器?
  • @ErfanEghterafi 检查此answer
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我可能会偏离路线,但我想建议您使用比 OnItemClickListener 更广泛的 Spinners 的 OnItemSelectedListener

    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
        }
    });
    

    【讨论】:

      【解决方案5】:

      使用getItemAtPosition:

      supplier.getItemAtPosition(position).toString();
      

      【讨论】:

        【解决方案6】:

        使用这个

        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
        
                }
            });
        

        【讨论】:

          【解决方案7】:

          我遇到过这个问题。 setOnItemClickListener 不适用于微调器。我的解决方案如下:

          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) {
          
                  }
              });
          

          【讨论】:

            【解决方案8】:

            我认为您代码中的supplier 表示spinner,请替换此行

             String msupplier=supplier.getSelectedItem().toString();
            

            下面一行:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多