2015-09-29 5 views
5

Problem: Ich habe viele seekbars (verwaltet von RecyclerView.Adapter), wenn ich scroll Ansicht, und spezifische seekbar nicht mehr angezeigt wird, setzt Fortschritt in dieser Suchleiste von selbst auf 0 (ich kann sehen Sie dies in OnSeekBarChangeListner). Ich wundere mich warum.Seekbar ändert Wert selbst in RecyclerView

Erwartetes Verhalten: Wenn der Benutzer den Wert nicht durch Ziehen der Suchleiste ändert, sollte sich der Fortschritt nicht ändern.

Meine Workaround für jetzt ist zu prüfen, ob Suchleiste angezeigt wird, und nur als Wert speichern.

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

      } 
     }); 
    } 
} 

Mein ViewHolder für 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

Irgendwelche Lösungen dazu? – Orcun

Antwort

2

Sie müssen überprüfen, dass Änderungen durch den Benutzer gemacht werden oder nicht. Sie können dies mit "fromUser" Variable wie folgt tun:

((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, danke für deine Antwort, aber seekBar.isShown() reicht aus, um den Wert von seekBar zu ändern, wenn er nicht sichtbar ist. Ich bin nur neugierig, warum dieses Veränderungs-Wert-Verhalten überhaupt stattfindet. –