2015-09-29 19 views
5

Vấn đề: Tôi có nhiều thanh tìm kiếm (được quản lý bởi RecyclerView.Adapter), khi tôi xem dạng cuộn, và thanh tìm kiếm cụ thể không được hiển thị nữa, tiến trình trong bộ tìm kiếm này tự nó thành 0 (tôi có thể thấy điều này trong OnSeekBarChangeListner). Tôi tự hỏi tại sao.Giá trị thay đổi của Seekbar trong RecyclerView

Hành vi mong đợi: Khi người dùng không thay đổi giá trị bằng cách trượt thanh tìm kiếm, tiến trình sẽ không thay đổi.

Giải pháp thay thế của tôi bây giờ là kiểm tra xem thanh tìm kiếm có hiển thị không và chỉ lưu giá trị.

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

      } 
     }); 
    } 
} 

ViewHolder của tôi cho 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

Bất kỳ giải pháp nào cho điều đó? – Orcun

Trả lời

2

bạn phải kiểm tra rằng những thay đổi được thực hiện bởi người dùng hay không. bạn có thể làm điều này với biến "fromUser" như sau:

((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, cảm ơn vì câu trả lời của bạn, nhưng phương thức seekBar.isShown() là phương thức đủ để ngừng thay đổi giá trị của seekBar, khi nó không ở chế độ xem. Tôi chỉ tò mò tại sao hành vi thay đổi giá trị này lại xảy ra. –

Các vấn đề liên quan