2017-10-25 14 views
2

Recyclerの表示アイテムの色の変更がスクロール後に繰り返されます。Recyclerの表示アイテムの色の変更スクロール後に繰り返す

私はRecyclerviewリストの紫色の位置で色を変えました。スクロールが発生すると、下の別の項目が同じ変更になります。そしてそれはパターンで繰り返されています。これを解決するには?

holder.recycle_Listing.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      itemListener.connectionClicked(v,position, itemtype); 

      holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 

     } 
    }); 
+0

です。https://stackoverflow.com/questions/40692214/changing-background-color-of-selected-item-in-recyclerview –

+0

より多くのコードを入力してくださいあなたのアダプターは、あなたがクリックした位置と同じ位置で再現されているので、あなたが色を変えた後、あなたのために表示されます。 –

+0

はい、その@AchmadNaufalSyafiqの解決策が見つかりました。応答していただきありがとうございます。 –

答えて

0

ただ、アレイ内のすべての項目キーを保存し、その選択したアレイはまた私のアダプタクラスを通過しました。単純な色の変更でさえこの形式でうまく動作します。ここでコードは私の要件に従って変更されています。

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

     JsonObject object = dataArray.get(position).getAsJsonObject(); 
     if(selectedArray.contains(object.get("userkey").getAsString())) 
     { 
      GradientDrawable borCol = new GradientDrawable(); 
      borCol.setCornerRadius(7); 
      borCol.setColor(Color.parseColor("#ffffff")); 
      borCol.setStroke(2, Color.parseColor("#60B9E1")); 
      holder.recycle_Listing.setBackgroundDrawable(borCol); 
      //holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 
     } 
     else 
     { 
      GradientDrawable borCol = new GradientDrawable(); 
      borCol.setCornerRadius(7); 
      borCol.setColor(Color.parseColor("#ffffff")); 
      borCol.setStroke(1, Color.parseColor("#e0e0e0")); 
      holder.recycle_Listing.setBackgroundDrawable(borCol); 
      //holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1")); 
     } 


      holder.profileName.setText(object.get("name").getAsString()); 

     holder.recycle_Listing.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 


       holder.mainlayout.setSelected(!holder.mainlayout.isSelected()); 

       if (holder.mainlayout.isSelected()) { 
        GradientDrawable borCol = new GradientDrawable(); 
        borCol.setCornerRadius(7); 
        borCol.setColor(Color.parseColor("#ffffff")); 
        borCol.setStroke(2, Color.parseColor("#60B9E1")); 
        holder.recycle_Listing.setBackgroundDrawable(borCol); 
        // holder.mainlayout.setBackgroundColor(Color.parseColor("#11B5DA")); 
       } else { 
        GradientDrawable borCol = new GradientDrawable(); 
        borCol.setCornerRadius(7); 
        borCol.setColor(Color.parseColor("#ffffff")); 
        borCol.setStroke(1, Color.parseColor("#e0e0e0")); 
        holder.recycle_Listing.setBackgroundDrawable(borCol); 
        // holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1")); 
       } 



       itemListener.connectionClicked(v,position, itemtype); 


       //holder.mainlayout.setBackgroundColor(Color.parseColor("#11B5DA")); 
       //holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1")); 
      } 
     }); 



    } 

このコードは、リサイクル業者で色が繰り返し変更されることなく正常に動作します。質問や意見があれば、

1

私はあなたがそのような

List<Integer> selectedPosition = new ArrayList(yourDataSize); 
void onBindViewHolder(VH holder, int position){ 

    if(selectedPosition.get(position) == 1){ 
     holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 
    }else { 
     holder.mainlayout.setBackgroundColor(normalColor); 
    } 

    //when the item clicked 
    selectedPosition.add(position,1); 

} 
として​​
+0

データクラスは何ですか? –

+0

私の回答を更新します。@ SARATHV – CoXier

+0

解決策が見つかりました。ありがとう –

0

でその機能をお使いの背景色を設定することができると思いますが、画面がスクロールされたときにその位置を新しい値に置き換えられる絶対的ではなく相対的な位置を返します。あなたのリストからあなたの望む結果を得るための位置を使用してください。

0

リサイクルビューのビューアのリサイクルによるものです。これを試してください それは私のために働いた。アイテムがクリックされたときに

public ListViewHolder(View itemView) { 
     super(itemView); 

     this.setIsRecyclable(false); 


    } 
+0

リサイクラビューがキャッシュに使用されているので、私はそれは良い考えではないと思います。 – CoXier

+0

はこのコードでリサイクル業者の目的を無効にしましたか?それは容認できる方法ではありません。 –

+0

@SARATHV私の方法はあなたのために働くはずです。 – CoXier

0

試して、あなたのアダプタクラスでこのメソッドを実装することが

@Override 
    public void onViewRecycled(ViewHolderProduct holder) { 
     super.onViewRecycled(holder); 
     holder.mainlayout.removeAllViews(); 
} 
2

にリサイクルビューをあなたの問題を解決するためだかもしれはOnBindViewHolder.Soでビューをリサイクルすることは、いくつかの他にも反映されますこれを解決するために。クリックした位置を格納するためのグローバルSparseBooleanArrayを作成します。

private final SparseBooleanArray array=new SparseBooleanArray(); 

最終的なビューホールダーの内側にclickListenerを追加し、クリックしたアイテムの位置をonClickストアします。

public class ViewHolder extends RecyclerView.ViewHolder { 
    public YOURVIEW view; 
    public ViewHolder(View v) { 
     super(v); 
     view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID); 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       array.put(getAdapterPosition(),true); 
       notifyDataSetChanged(); 
      } 
     }); 
    } 
} 

内部OnBindViewHolderで

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    if(array.get(position)){ 
     holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1")); 
    }else{ 
     holder.mainlayout.setBackgroundColor(UNSELECTEDCOLOR); 
    } 
} 
+0

多くのアイテムをクリックすることができるので、 'mItemSelected'だけでは不十分です。 – CoXier

+0

次に、sparseBoolean Arrayを使用します。更新されたコードを確認してください。 – Anonymous

+0

私はあなたの論理を得ました。ありがとう –

関連する問題