2017-01-05 8 views
1

быстрый вопрос, так как мой другой вопрос так и не получил ответа. У меня есть RecyclerView, который заполняется SeekBar для каждого предмета (CardView). Я хотел бы знать, как наилучшим образом получить эту позицию SeekBar.Получение позиции для поиска в режиме recyclerview?

Другими словами, как бы я мог отличить первый брекер от второго стрелка, если есть два элемента в recyclerview, каждый из которых содержит свой собственный SeekBar?

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

Пример кода по запросу:

class ViewHolder extends RecyclerView.ViewHolder { 
    private TextView mName, mUsername, mPercent; 
    private SeekBar mSeekBar; 

    ViewHolder(View itemView) { 
     super(itemView); 
     mName = (TextView) itemView.findViewById(R.id.name_view_members); 
     mUsername = (TextView) itemView.findViewById(R.id.username_view_members); 
     mPercent = (TextView) itemView.findViewById(R.id.percent_text); 
     mSeekBar = (SeekBar) itemView.findViewById(R.id.percent_seekbar); 
    } 
} 
@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    GroupMembers individual = mMembers.get(position); 
    holder.mName.setText(individual.getName()); 
    holder.mUsername.setText(individual.getUsername()); 

    //SeekBar Listener 
    holder.mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

      //Find out which SeekBar triggered the event 
      int which = whichIsIt(seekBar.getId(), progress); 

      //Stored progress (where is it at) 
      int storedProgress = mAllProgress.get(which); 

      /**Two cases can occur: User goes left or right with the thumb. 
      * If RIGHT, we must check how much he's allowed to go in that 
      * direction (based on other seekbars), and stop him before it's 
      * too late. If LEFT, free up the space to allow the other seekbars. 
      **/ 
      if (progress > storedProgress) { 
       //How much remains based on all seekbars. 
       int remaining = remaining(); 
       //If progress 100%, don't let user move. (overextend) 
       if (remaining == 0) { 
        seekBar.setProgress(storedProgress); 
       } else { 
        //Progress available, check the availability of others, 
        //and let the user move as long as it's below 100% total. 
        if (storedProgress + remaining >= progress) { 
         mAllProgress.set(which, progress); 
        } else { 
         mAllProgress.set(which, storedProgress + remaining); 
        } 
       } 
      } else if (progress <= storedProgress) { 
       mAllProgress.set(which, progress); 
      } 
     } 

     private int whichIsIt(int id, int progress) { 
      holder.mPercent.setText(" " + progress + "%"); 
      return R.id.percent_seekbar; 
     } 

     private int remaining() { 
      int remaining = TOTAL_AMOUNT; 
      for (int i = 0; i < mAllProgress.size(); i++) { 
       remaining -= mAllProgress.get(i); 
      } 
      if (remaining >= 100) { 
       remaining = 100; 
      } else if (remaining <= 0) { 
       remaining = 0; 
      } 
      return remaining; 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 
    }); 

Метод whichIsIt должен определить, какие SeekBarRecyclerView в настоящее время срабатывает.

+0

опубликовать ваш образец кода – raj

+0

@raj Я отредактировал/добавил пример кода выше. Любая помощь будет очень признательна ... Я давно застрял. –

+0

@AndrewMagana У меня есть несколько поисковых систем, и когда я прокручиваю предыдущий, он меняет звук, как его предотвратить.? –

ответ

1

Вы можете установить метку для каждого SeekBar с положением в адаптере seekBar.setTag(holderPosition);

Таким образом, в методе onProgressChanged(SeekBar seekBar,...) вы seekBar.getTag(). Таким образом, вы можете изменить свои данные в правильном положении.

P.S: Если OnSeekBarChangeListener одинаково для всех кнопок поиска, вы можете создать с ним частное поле. ;)

+0

Это помогло мне подойти ближе, и он технически отвечает на вопрос, который у меня был. Быстрый вопрос ... когда я использую 'seekBar.getTag()' в моей 'storedProcess', он дает ошибку каждый раз, когда я пытаюсь переместить поисковую панель, отличную от первой. Почему это? «GetTag» не просто захватит позицию, затронутую, так как это тег, который я установил (позиция держателя)? –

+1

Какая ошибка? – Sanf0rd

+0

Извините, моя ошибка, это не относится к getTag. Спасибо за помощь! –