2015-09-29 5 views
5

問題:多くのシークバー(RecyclerView.Adapterによって管理されています)が表示され、特定のシークバーが表示されなくなったとき、このシークバーの進行状況は0になりますOnSeekBarChangeListnerでこれを参照してください)。なぜ私は不思議です。RecyclerViewでSeekbar自体が値を変更する

予想される動作 ユーザーがシークバーをスライドして値を変更しない場合、進捗状況は変更しないでください。

私の回避策は、シークバーが表示されているかどうかを確認し、値を保存するだけです。

@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マイViewHolder 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

これに対する解決策はありますか? – Orcun

答えて

2

のためのあなたは、変更がユーザーによって行われたか、されていないことを確認する必要があります。次のように "fromUser"変数でこれを行うことができます:

((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

あなたの答えはありがたいですが、seekBar.isShown()はseekBarの値が表示されていないときに変更を停止するのに十分な方法です。私はこの変化する価値観がなぜ全く起こるのか不思議です。 –

関連する問題