2010-04-28 38 views
7

Tôi đang cố gắng làm cho Spinner hoạt động theo cách khác khi người dùng nhấp vào một mục trong một thời gian dài. Tôi có spinner với một số dự án và tôi muốn hai điều.Làm cách nào để sử dụng spinner setOnItemLongClickListener

  1. Khi người dùng nhấp đơn giản vào một mục tôi muốn bình thường, hãy chọn nó.
  2. Khi người dùng từ lâu đã nhấp vào một mục tôi muốn hiển thị hộp thoại, với các tùy chọn như "Chỉnh sửa mục", "Xóa mục".

Bước đầu tiên hoạt động tốt (ofcourse), nhưng khi tôi cố gắng thực hiện tác vụ thứ hai, tôi không thể tạo spinner để tạo sự kiện longClicked.

Đây là mã của tôi:

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

    }); 

Trả lời

15

Các Spinner hiện không hỗ trợ OnItemLongClickListener.

+0

Đây là [liên kết tài liệu] (http://developer.android.com/reference/android/widget/Spinner.html#setOnItemClickListener%28android.widget.AdapterView.OnItemClickListener%29). – MaxChinni

8

Bạn có thể thêm OnLongClickListener vào Spinner. Nó sẽ không bị sa thải khi một mục trên menu được nhấp lâu nhưng nó sẽ được kích hoạt khi người dùng nhấp chuột dài vào chính spinner.

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

1) Tạo một lớp tùy chỉnh spinner bằng cách mở rộng spinner,

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

Sử dụng spinner ở trên theo quan điểm xml của bạn.

2) Xác định một giao diện để xử lý nhấp chuột,

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

3) Trong lớp spinner adapter của bạn làm những chất liệu trong getView và 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) Trong khi instantiating adapter, vượt qua ClcikListener giao diện chúng tôi tạo ra.

5) và trong lớp thực hiện làm như sau,

@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); 
    } 
+1

Làm việc như một sự quyến rũ. Tôi đã thêm tham số "int position" vào các phương thức giao diện để xác định mục nào được nhấp lâu. –

0

chỉ cần sử dụng một touchlistener với xử lý. để nhận mục đã chọn spinner.getSelectedItemPosition

Các vấn đề liên quan