2015-09-29 19 views
5

Sorun: Görünümü kaydırdığımda birçok arama çubuğum var (RecyclerView.Adapter tarafından yönetiliyor), ve artık belirli bir arama çubuğu gösterilmiyor, bu arama çubuğundaki ilerleme kendini 0 olarak ayarlıyor (I can Bunu OnSeekBarChangeListner'da görüyoruz). Nedenini merak ediyorum.Seekbar, RecyclerView öğesinde kendi değerini değiştirir

Beklenen davranış: Kullanıcı kayan arama çubuğuyla değeri değiştirmediğinde, ilerleme değişmemelidir.

Şimdiki çözümüm, arama çubuğunun gösterilip gösterilmediğini ve yalnızca değerlerin kaydedilip kaydedilmediğini kontrol etmektir.

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

Bunun için herhangi bir çözüm var mı? – Orcun

cevap

2

değişikliklerin kullanıcı tarafından ya da olmasın hazır olduğunu kontrol etmeli için

Benim ViewHolder

@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) { 

      } 
     }); 
    } 
} 
onBindViewHolder. Bunu "fromUser" değişkeniyle yapabilirsiniz:

((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, cevabınız için teşekkürler, ancak seekBar.isShown(), görünümde değilken seekBar değerini değiştirmeyi durdurmak için yeterli yöntemdir. Bu değişen değer davranışının niçin gerçekleştiğini merak ediyorum. –

İlgili konular