2015-09-29 20 views
5

Problema: Ho molte barre di ricerca (gestite da RecyclerView.Adapter), quando scorro la vista, e la barra di ricerca specifica non viene più mostrata, l'avanzamento in questa barra di ricerca si imposta da solo a 0 (posso vedere questo in OnSeekBarChangeListner). Mi chiedo perché.Seekbar cambia valore da solo in RecyclerView

Comportamento previsto: Quando l'utente non modifica il valore facendo scorrere la barra di ricerca, i progressi non dovrebbero cambiare.

La mia soluzione ora è controllare se viene visualizzata la barra di ricerca e solo il valore di salvataggio.

onBindViewHolder

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int positi 
    final DMXChannel currentChannel = channels.get(position); 

    ... // Not relevant 
else if (holder instanceof ViewHolderSlider) { 
     ((ViewHolderSlider) holder).container.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       if (listner != null) 
        listner.onLongItemClicked(currentChannel.getIndex(), v); 
       return true; 
      } 
     }); 
     final ViewHolderSlider holderSlider=((ViewHolderSlider) holder); 
       ((ViewHolderSlider) holder).tvPosition.setText("" + (currentChannel.getIndex() + 1)); 
     int value =currentChannel.getValue(); 
     holderSlider.slider.setProgress(value); 
     ((ViewHolderSlider) holder).tvValue.setText("" + currentChannel.getValue()); 
     ((ViewHolderSlider) holder).slider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
       holderSlider.tvValue.setText("" + progress); 
       if(position!=RecyclerView.NO_POSITION) { 
        if(seekBar.isShown()) 
        currentChannel.setValue(progress); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 
    } 
} 

mio ViewHolder per seekbars

public static class ViewHolderSlider extends RecyclerView.ViewHolder { 
    public TextView tvPosition; 
    public TextView tvValue; 
    public CardView container; 
    public VerticalSeekBar slider; 
    public ViewHolderSlider(View v) { 
     super(v); 
     slider= (VerticalSeekBar)v.findViewById(R.id.slider); 
     Drawable thumb = MyApp.getContext().getResources().getDrawable(R.drawable.ic_add_white_24dp); 
     slider.setThumb(thumb); 
     thumb.mutate().setAlpha(0); 
     container= (CardView)v.findViewById(R.id.rootView); 
     tvPosition= (TextView) v.findViewById(R.id.tv_channel_number); 
     tvValue = (TextView) v.findViewById(R.id.tv_value); 
    } 
} 
+0

Qualche soluzione? – Orcun

risposta

2

è necessario verificare che le modifiche sono fatte da utente o meno. puoi farlo con la variabile "fromUser" in questo modo:

((ViewHolderSlider) holder).slider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     holderSlider.tvValue.setText("" + progress); 
     if(position!=RecyclerView.NO_POSITION) { 
      if(seekBar.isShown() && fromUser) 
       currentChannel.setValue(progress); 
     } 
    } 
+0

Saeed, grazie per la risposta, ma seekBar.isSown() è un metodo sufficiente per interrompere il cambiamento del valore di seekBar, quando non è in vista. Sono solo curioso del perché questo comportamento a cambiamento di valore avvenga. –