2017-01-05 20 views
1

早急に質問してください。私はRecyclerViewを持っていて、すべてのアイテム(CardView)に対してSeekBarが入力されています。このSeekBarのポジションを得る最良の方法を知りたいのですが。recyclerviewからseekbarの位置を取得していますか?

つまり、recyclerviewに2つのアイテムがあり、それぞれに独自のSeekBarが含まれている場合、最初のシークバーと2番目のシークバーを区別するにはどうすればよいですか?

また、これが役立つ場合は、上記SeekBarのリスナーが私のアダプターにあります。要求に応じてコードの

サンプル:RecyclerViewSeekBarがトリガされているかを決定する必要がありwhichIsIt

class ViewHolder extends RecyclerView.ViewHolder { 
    private TextView mName, mUsername, mPercent; 
    private SeekBar mSeekBar; 

    ViewHolder(View itemView) { 
     super(itemView); 
     mName = (TextView) itemView.findViewById(R.id.name_view_members); 
     mUsername = (TextView) itemView.findViewById(R.id.username_view_members); 
     mPercent = (TextView) itemView.findViewById(R.id.percent_text); 
     mSeekBar = (SeekBar) itemView.findViewById(R.id.percent_seekbar); 
    } 
} 
@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    GroupMembers individual = mMembers.get(position); 
    holder.mName.setText(individual.getName()); 
    holder.mUsername.setText(individual.getUsername()); 

    //SeekBar Listener 
    holder.mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

      //Find out which SeekBar triggered the event 
      int which = whichIsIt(seekBar.getId(), progress); 

      //Stored progress (where is it at) 
      int storedProgress = mAllProgress.get(which); 

      /**Two cases can occur: User goes left or right with the thumb. 
      * If RIGHT, we must check how much he's allowed to go in that 
      * direction (based on other seekbars), and stop him before it's 
      * too late. If LEFT, free up the space to allow the other seekbars. 
      **/ 
      if (progress > storedProgress) { 
       //How much remains based on all seekbars. 
       int remaining = remaining(); 
       //If progress 100%, don't let user move. (overextend) 
       if (remaining == 0) { 
        seekBar.setProgress(storedProgress); 
       } else { 
        //Progress available, check the availability of others, 
        //and let the user move as long as it's below 100% total. 
        if (storedProgress + remaining >= progress) { 
         mAllProgress.set(which, progress); 
        } else { 
         mAllProgress.set(which, storedProgress + remaining); 
        } 
       } 
      } else if (progress <= storedProgress) { 
       mAllProgress.set(which, progress); 
      } 
     } 

     private int whichIsIt(int id, int progress) { 
      holder.mPercent.setText(" " + progress + "%"); 
      return R.id.percent_seekbar; 
     } 

     private int remaining() { 
      int remaining = TOTAL_AMOUNT; 
      for (int i = 0; i < mAllProgress.size(); i++) { 
       remaining -= mAllProgress.get(i); 
      } 
      if (remaining >= 100) { 
       remaining = 100; 
      } else if (remaining <= 0) { 
       remaining = 0; 
      } 
      return remaining; 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
     } 
    }); 

方法。

+0

コードサンプルを投稿 – raj

+0

@raj上記のサンプルコードを編集/追加しました。どんな助けでも大いに感謝されるでしょう...私はしばらくの間立ち往生しています。 –

+0

@AndrewMagana私は複数のシークバーを持っており、前の1つをスクロールすると、それを防ぐ方法をオーディオに変更します。 –

答えて

1

あなたはseekBar.getTag()を行うonProgressChanged(SeekBar seekBar,...)方法でそうアダプタに位置してseekBar.setTag(holderPosition);

を各シークバーのタグを設定することができます。これにより、正しい位置にデータを変更することができます。

P.S:OnSeekBarChangeListenerがすべてのseekBarsで同じ場合、それを使用してプライベートフィールドを作成できます。 ;)

+0

これは私に一歩近づいて、それはtechincally私が持っていた質問に答える。簡単な質問...私の 'storedProcess'で' seekBar.getTag() 'を使用すると、最初の位置以外のシークバーを移動しようとするたびにエラーが発生します。どうしてこれなの? 'getTag'は単にそれが私が設定したタグ(ホルダーの位置)であるので触れた位置をつかむだけではありませんか? –

+1

エラーは何ですか? – Sanf0rd

+0

私の間違い申し訳ありませんが、getTagには関係ありませんでした。ご協力ありがとうございました! –

関連する問題