2014-10-26 7 views
0

Мне нужно добавить возможность редактирования элементов счетчика с помощью контекстного меню или диалога, который должен появиться, когда пользователь долго нажмите пунктSpinner setOnItemLongClickListener не работает

В this question я вижу, что кто-то пыталось использование

spinner.setOnItemLongClickListener(new OnItemLongClickListener() { 

      public boolean onItemLongClick(AdapterView<?> parent, View view, int arg2, long arg3) { 

       view.showContextMenu(); 
       return true; 

      } 
     }); 

но такой способ не работает.

Я заселить Spinner с

ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.my_spinner_item_layout, itemList); spinner.setAdapter(adapter); 

я вижу в другом вопросе, что просто было предложено, чтобы избежать, чтобы попытаться реализовать контекстное меню для Spinner, но у меня нет много места, поэтому я не могу использовать ListView без уродливых результатов, и это действие необходимо только для редкой ситуации, поэтому контекстное меню или что-то подобное кажется единственным допустимым выбором.

Как я могу реализовать контекстное меню для Spinner или расширить Android Spinner, чтобы поддерживать длительный щелчок по элементам внутри Spinner?

+0

пытаются перепроверить свой «вращателя идентификатор» /, если у вас есть вложенные вид, то отключить фокус на этом макете, чтобы получить событие на блесны –

+0

у меня есть Spinner, который показывает Array of String (без пользовательской реализации Spinner), я не понял, что вы имеете в виду. Не могли бы вы дать мне более подробную информацию? – AndreaF

+0

Можете ли вы добавить свой код для отладки .. мы не можем вам помочь, пока не увидим вашу реализацию ... –

ответ

0

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