【问题标题】:How can I use spinner setOnItemLongClickListener如何使用微调器 setOnItemClickListener
【发布时间】:2010-04-28 14:59:50
【问题描述】:

当用户长时间单击某个项目时,我试图让 Spinner 以不同的方式表现。我有一些项目的微调器,我想要两件事。

  1. 当用户简单地点击一个项目我想正常选择它。
  2. 当用户长时间点击我想显示的项目时,对话框中包含“编辑项目”、“删除项目”等选项。

第一步效果很好(当然),但是当我尝试执行第二个任务时,我无法让微调器生成 longClicked 事件。

这是我的代码:

    this.projectSpinner = (Spinner) this.findViewById(R.id.SpinnerProjects);
    this.projectSpinner.setLongClickable(true);

    this.projectSpinner.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
        public boolean onItemLongClick(AdapterView<?> arg0, 
                                       View arg1, 
                                       int arg2, 
                                       long arg3) {
            Toast.makeText(
                 AndroidTimeTrackerMainActivity.this, 
                 "Long click", 
                 Toast.LENGTH_SHORT).show(); // This toast doesn't show up.
            return false;
        }

    });

【问题讨论】:

    标签: android spinner


    【解决方案1】:

    Spinner目前不支持OnItemLongClickListener

    【讨论】:

    【解决方案2】:

    您可以将 OnLongClickListener 添加到 Spinner。当菜单上的项目被长按时它不会被触发,但是当用户长按微调器本身时它会被触发。

    this.projectSpinner.setOnLongClickListener(new OnLongClickListener() 
    {
        @Override
        public boolean onLongClick(View v) 
        {
            System.out.println(chuteSpinner.getSelectedItem().toString() + " is long clicked");
            return true;
        }
    });
    

    【讨论】:

      【解决方案3】:

      1) 通过扩展微调器创建自定义微调器类,

      public class CCSpinner extends Spinner {
          public CCSpinner(Context context) {
              super(context);
          }
      
          public CCSpinner(Context context, int mode) {
              super(context, mode);
          }
      
          public CCSpinner(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
          public CCSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
              super(context, attrs, defStyleAttr);
          }
      
          public CCSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
              super(context, attrs, defStyleAttr, mode);
          }
      
          @Override
          public void onDetachedFromWindow() {
              super.onDetachedFromWindow();
          }
      } 
      

      在您的 xml 视图中使用上述微调器。

      2) 定义一个接口来处理点击,

       public interface ClickListener {
              void onItemLongClicked(View view);
              void onItemClicked(View view);
          }
      

      3) 在您的微调器适配器类中,在 getView 和 getDropDownView 中执行这些操作

      @Override
          public View getView(int position, View convertView, ViewGroup parent) {
              //ususal stuffs
              convertView.setTag(R.string.click_tag, position);
              convertView.setClickable(false);
              convertView.setLongClickable(false);
      
      
      
              return convertView;
          }
      
      
          @Override
          public View getDropDownView(int position, View convertView, ViewGroup parent) {
              //ususal stuffs
              convertView.setTag(R.string.click_tag, position);
      
              convertView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if (clickListener != null) {
                          clickListener.onItemClicked(v);
                      }
                  }
              });
      
      
              convertView.setOnLongClickListener(new View.OnLongClickListener() {
                  @Override
                  public boolean onLongClick(View v) {
                      if (clickListener != null) {
                          clickListener.onItemLongClicked(v);
                      }
                      return true;
                  }
              });
      
              return convertView;
          }
      

      4) 在实例化适配器时,传递我们创建的 ClcikListener 接口。

      5) 并在实现类中执行以下操作,

      @Override
          public void onItemLongClicked(final View view) {
              mPSpinner.onDetachedFromWindow();
              final int pos = (int) view.getTag(R.string.click);
              mPSpinner.setSelection(pos);
          }
      
      
          @Override
          public void onItemClicked(final View view) {
              mPSpinner.onDetachedFromWindow();
              int pos = (int) view.getTag(R.string.click);
              mPSpinner.setSelection(pos);
          }
      

      【讨论】:

      • 工作就像一个魅力。我在接口方法中添加了一个“int position”参数来确定哪个项目被长按。
      【解决方案4】:

      只需使用带有处理程序的 touchlistener。用于获取所选项目

      spinner.getSelectedItemPosition
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        相关资源
        最近更新 更多