2013-04-02 4 views
6

У меня есть два прядильщика, которые я хочу «привязать» друг к другу во взаимоисключающем смысле: если вы выберите элемент в одном, текст этого пункта станет красным и появится вверху, тогда как другой возвращается к отображению начального («title») выбора (если ранее был выбран другой элемент), и его текст становится белым.«Синхронизация» двух прядильщиков

Это все делается через onItemSelected слушателей:

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, 
       int position, long arg3) {    
      issueSpin.setSelection(0);          
      ((TextView) issueSpin.getChildAt(0)).setTextColor(Color.parseColor("#FFFFFF")); 
      ((TextView) arg1).setTextColor(Color.parseColor("#E3170D")); 
.... 

и наоборот для «выпуска блесны». Моя проблема в том, что если я перехожу от одного счетчика к другому, и я выбираю верхний элемент, onItemSelectedListener не регистрируется, потому что выбранный элемент уже выбран.

Мне сказали, что это невозможно. Или, скорее, мне сказали, что невозможно, чтобы прослушиватель onItemSelected запускал элемент, который уже выбран. Хотя я понимаю, что это технически верно, эта проблема кажется относительно простой, и я уверен, что должно быть обходное решение для получения желаемого эффекта.

У меня есть несколько вопросов по поводу некоторых, что я размышлял:

  1. Есть ли способ, чтобы установить все элементы в блесны как невыбранные, в то же время отображения одного из них?
  2. Могу ли я использовать другой тип события (то есть «setOnTouchListener», «setOnClickListener» и т. Д.), Предположительно на верхнем элементе, в сочетании с onItemSelectedListener?
  3. Должен ли я использовать другой тип события сам по себе, возможно, на Представлениях, завышенных в самих счетчиках, без onItemSelectedListener?
  4. Можете ли вы помочь мне найти лучшую стратегию, чем те, на которые ссылаются в пунктах выше?

ответ

1

Вместо использования Spinner используйте Button, который визуально напоминает неактивный Spinner. Когда кнопка нажата, покажите пользовательский номер Dialog, содержащий ListView. Вы можете использовать метод setSelection и/или позицию в Adapter's getView, чтобы показать, какой элемент в данный момент выбран. ListViewOnItemClickListener получит уведомление о том, что что-то нажали, независимо от того, был выбран элемент или нет.

Когда вы найдете, какой элемент был щелкнул, скрыть Dialog и уведомит кнопку содержащих Activity этого, так что он может обновить и Buttons в случае необходимости.

Я реализовал что-то действительно похожее на это, используя DialogFragments и DialogFragmentParent, и он отлично работает.

+0

Но для общего дизайна этого приложения очень важно, чтобы меню открылось, как прядильщик - то есть, что параметры выпадают. – drewmoore

+0

@drewmore Я дал ответ, который решает описанную проблему в вопросе. Сначала я рассмотрел подкласс для «Spinner» и переопределения ответственного метода (где явно указано, что 'onItemSelectedListener' не вызывается, если выбранный элемент одинаков), но это было невозможно, так как метод является закрытым. Вы можете эмулировать анимацию, если вам это нужно так плохо, используя некоторые другие средства. Однако, если мой ответ не поможет вам из-за некоторых не раскрытых в вопросе причин, то вы должны отредактировать свой вопрос. – Shade

1

Вы рассмотреть что-то вроде ниже,

sectionSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("sectionSpin"); 
    } 
} 

И другой

issueSpin.setOnItemSelectedListener(new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, 
      int position, long arg3) { 
     updateView("issueSpin"); 
    } 
} 

и теперь

private void updateView(String spinner){ 
    if (spinner.equals(sectionSpin)){ 
     //update spinner per requirement 

    } 
    else{ 
    //update spinner per requirement 
    } 

} 

Вы можете также рассмотреть некоторые дополнительные переменные или параметры отслеживать, если элемент выбран в первый раз или нет.

+0

Это все еще зависит от прослушивателя onItemSelected(), который не срабатывает, если пользователь выбирает элемент, который уже находится в верхней части. – drewmoore

0

Итак, вы можете сделать первый элемент в прядильщиках недействительными, например, «[Выбрать]» или «[Выбрать заголовок]», заставляя слушателя стрелять каждый раз.

Это будет иметь дополнительное преимущество, которое вы узнаете, что пользователь сделал что-то перед следующим шагом.

Конечно, это будет зависеть от желаемого расхода приложения.

Смежные вопросы