2016-12-23 3 views
0

最初にすべてのテキストを無視します。私は、押されている間、miカードの色を変更しようとしていました。その結果、カードが色を変えるという問題があります。色も変わります。カードビューでRecyclerViewのsetCardBackgroundColor

私はspareBoleanArrayを使用しています - ここ>の選択

は私のアダプタです。ここ

private class DotesAdapter extends RecyclerView.Adapter<DotesAdapter.DoteViewHolder> implements Filterable { 

    private ListaDotes mValues; 
    private DotesAdapter.DoteFilter mFilter; 



    public DotesAdapter(ListaDotes items){ 
     mValues=items; 
     mFilter= new DotesAdapter.DoteFilter(DotesAdapter.this); 


    } 

    @Override 
    public DotesAdapter.DoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false); 
     return new DotesAdapter.DoteViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(DotesAdapter.DoteViewHolder holder, int position) { 

     holder.Titulo.setText(mValues.get(position).getTitulo()); 

     String s; 
     int t = mValues.get(position).getTipo(); 
     if(t==0) 
      s= "GENERALES"; 
     else 
     if(t==1)s= "FORTALEZA"; 
     else 
     if(t==2)s= "REFLEJOS"; 
     else 
     if(t==3)s= "VOLUNTAD"; 
     else 
     if(t==4)s= "PRECISIÓN"; 
     else 
     if(t==5)s= "ATAQUE"; 
     else 
      s= "SOBRENATURALES"; 

     holder.Tipo.setText(s); 



     if(selections.get(position,false)) 
      holder.myBackground.setCardBackgroundColor(Color.RED); 



    } 

    @Override 
    public int getItemCount() { 
     return mValues.size(); 
    } 

    @Override 
    public Filter getFilter() { 
     // if(doteFilter == null) 
     // doteFilter = new DoteFilter(this, listaDotes); 
     return mFilter; 
    } 

は私ViewHolderです:

public class DoteViewHolder extends RecyclerView.ViewHolder { 

     TextView Titulo; 
     TextView Tipo; 

     CardView myBackground; 
     DotesAdapter adapter; 

     public DoteViewHolder(final View itemView) { 
      super(itemView); 
      Titulo=(TextView) itemView.findViewById(R.id.titulo); 
      Tipo=(TextView) itemView.findViewById(R.id.tipo); 

      myBackground =(CardView) itemView.findViewById(R.id.card); 


      itemView.setLongClickable(true); 
      itemView.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 


        Intent intent = new Intent(CrearPersonajeDotes.this,DoteView.class); 
        //Bundle b = new Bundle(); 
        //b=filteredList.get(getAdapterPosition()).toString(); 
        YoYo.with(Techniques.Flash).duration(200).playOn(v); 
        intent.putExtra("Dote", getAdapterPosition()); 
        intent.putExtra("Call",1); 
        startActivity(intent); 
        return true; 
       } 
      }); 

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
//HERE I CHANGE THE COLOR OF THE CARD TO RED IF THE POSITION OF THE ARRAYS IS ON TRUE OR BLUE IN THE OTHER CASE 
        if(!selections.get(getAdapterPosition(),false)) { 

         myBackground.setCardBackgroundColor(Color.RED); 
         selections.put(getAdapterPosition(),true); 
         Dote d = listaDotes.get(getAdapterPosition()); 
         MainCrearPersonaje.NPersonaje.addDote(d); 
         UpdatePDText(); 


        } 

        else{ 

         myBackground.setCardBackgroundColor(Color.BLUE); 
         selections.put(getAdapterPosition(),false); 
         Dote d = listaDotes.get(getAdapterPosition()); 
         MainCrearPersonaje.NPersonaje.removeDote(d); 
         UpdatePDText(); 


         ; 


        } 

       } 
      }); 
     } 
    } 
+0

私はあなたが正しい、setCardBackgroundColor使用して、その色を変更するには、単一のCardViewをクリックしようとしていると仮定していますか?その場合は、ItemViewではなく、CardView自体にclickイベントを設定してください。 –

+0

@NileshSinghは問題ではありません。 –

答えて

0

あなたは色を設定するonBindViewHolder()でコードが必要です。ビューがリサイクルされ、最後に使用されたときの色が残っているので、新しいデータをバインドするときに色を適切にリセットする必要があります。

int color = selections.get(position,false) ? Color.RED : Color.BLUE; 
holder.myBackground.setBackgroundColor(color); 
+0

Thx.これも試しましたが、onclick関数でsetBackgroundColorを削除しました。 –

+0

@IvánValdésonclickは別個で無関係です。要点は、画面からスクロールして表示を再利用し、古い表示を再利用して別の項目を表示することです。これを正しく処理する必要があります。これは、このビューにバインドされているアイテムデータに基づいて背景を設定することを意味します。 – Karakuri

1
//this line contains a logical error. it will evaluate to false when it 
//actually true...remove the ! and it should work fine 
if(!selections.get(getAdapterPosition(),false)) 
関連する問題