2016-10-13 16 views
0

私はRecyclerView.Adapterを使用して、異なるメッセージを運ぶ複数のViewHolderを表示しています。これはonBindViewHolder関数です:その後、OnBindViewHolderの下のonClickListener関数は奇妙な結果を返します

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.submitButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     holder.messageTextView.setText("Updated message"); 
    } 
    }); 
} 

起こって、私は第一ViewHolder上のsubmitButtonを押すと、そのメッセージは、「更新されたメッセージ」として、その上に表示されていることである奇妙なことが、私は他のViewHoldersまでスクロールし、 5番目のViewHolderには「更新されたメッセージ」も含まれており、9th、13thなどにはすでにメッセージが表示されています。同様に、2番目のViewHolderでsubmitButtonを押すと、メッセージは2番目、6番目、10番目、14番目などに表示されます。

理想的には、1番目のViewHolderでsubmitButtonを押すと、最初のViewHolderにのみメッセージを表示し、他のViewHolderでは表示しないようにしてください。

私はonClickの機能のインナークラス内でそれを呼び出すことができるように最終としてパラメータViewHolderホルダーを入れていました。

私はなぜこれが起こっていると私はこれまでの機能onBindViewHolder使用していないが、私はそれが引数ViewHolderホルダーが「最後の」であることに関連したものだと感じ見当がつかない。

答えて

1

問題は、ViewHolderの再利用によるものです。 セルをスクロールすると、再使用され、新しいセルは作成されません。

アダプターは、表示セルに等しい数のセルを作成します。また、画面のスクロールは常に再利用されます。

あなたはそれがどこかに、そのような位置は、TextViewに更新した保存し、あなたが位置に基づいて、空の文字列へのTextViewのテキスト、または「更新されたメッセージ」を設定する必要があるかどうかを確認するためのチェックonBindViewHolderで追加する必要があります

+0

とった!だから、私はちょうどいくつかの位置、ボタンがクリックされた場合、それはちょうどそのViewHolderのonCreateを介してメッセージを表示するかどうかを確認することができます。 ViewHoldersの再利用について知らなかった。ありがとう! –