2017-12-18 13 views
0

recyclerViewでクリックすると、特定のボタンの背景イメージを変更しようとしています。ボタンの背景画像が適切に変化しているだけでなく、8th.16th..etc行にあるボタンの背景も変更されます。recyclerviewから特定のボタンにアクセスし、その背景イメージを変更します。

(私は現在、forループテストのために使用したリサイクルビューのデータを投入しています)私のコードでは、背景はそのRecyclerView、ので

@Override 
public void onBindViewHolder(final myFirstAdapter.ViewHolder holder, int position) { 

    firstlistitem listItem = listItems.get(position); 

    holder.itemView.setTag(position); 
    holder.btnBookMark.setTag(position); 

    holder.btnBookMark.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) {     
    holder.btnBookMark.setBackgroundResource(R.drawable.bookmarkred); 
      } 
    }); 
} 
+0

だから、あなたのリストの8番目、16番目、およびそれ以降の各項目の背景を変更したいのですか? – Gautam

+0

Gautamはありません。押されたボタンの背景を変更するだけです。しかし、このコードはボタンの背景を変更しており、第8と第16の –

+0

は大丈夫です。 recyclerviewはビューをリサイクルして作業するので、背景色と背景色が再現されるようにビューが変更され、同じ色が再び表示されます。したがって、これを処理するには、オブジェクトを使用して状態を維持するか、またはdrawableにmutate()を使用するか、 – Gautam

答えて

0

変更され、それがビューをリサイクルし、それを再利用します。したがって、8番目の位置をクリックして下にスクロールすると、8番目のアイテムが他のアイテムのカスタム背景と再利用されます。このため、スクロールの後の項目のカスタム背景を取得しています。

背景が変更されるアイテムが多い場合は、これを実行します。

class ViewHolder extends RecyclerView.ViewHolder{ 
    boolean newBackground = false; 
    Button button 

    ViewHolder(View itemView){ 
     ... 
     button.setOnClickListner((v) - > newBackground = true); 
    } 
} 

次に、あなたが背景が一度に変更されるの項目を1つだけ持っているなら、あなたはアダプタでフィールドを宣言することができnewBackgroundの値をチェックし、onBindViewHolder()

に背景を設定することができますし、それを確認して背景を変更してください。

class MyAdapter extends RecyclerView.Adapter<ViewHolder>{ 

    int newBackgroundPos = -1; 

    @Override 
    public final void onBindViewHolder(ViewHolder holder, int position) { 
     holder.button.setOnClickListener((v) -> newBackGroundPos = position); 

     if(position == newBackgroundPos) 
      holder.itemView.setBackground(newBackground); 
     else 
      holder.itemView.setBackground(normalBackground); 
    } 
} 
+0

サランにお返事ありがとうございました。私はそれをあなたのやり方でやってみて、もちろんあなたの答えに戻るでしょう。 –

+0

@SinanNoureddine期待された成果を得ましたか? –

+0

ラムダ式がこの言語レベルでサポートされていないというエラーが表示されたため、あなたのソリューションがうまくいかなかったのは恐ろしいことです。しかし、リストと同じサイズの配列を作成し、配列のすべてのインデックスに対して、私がバックグラウンドを変更するかどうかをチェックすることで、動作させることができました。 –

関連する問題