2015-01-27 5 views
3

Я пытаюсь написать RecyclerView с помощью CardViews и использовать CAB, пытаясь удалить несколько карточек при выборе. Как я даю цвет фона выбранным картам. Я пытаюсь использовать statelistdrawable как следующее:CardView выбранный цвет фона в RecyclerView

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_activated="true" android:drawable="@color/primary_dark" /> 

    <item android:drawable="@android:color/transparent" /> 

</selector> 

и применить его к раскладке CardView как:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/card_view" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
android:background="@drawable/statelist_item_background" 
     card_view:cardCornerRadius="10dp" 
    card_view:cardElevation="10dp" 
android:layout_marginTop="5dp" 
android:layout_marginBottom="5dp" 
android:layout_marginLeft="5dp" 
android:layout_marginRight="5dp" 


    > 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 

     > 

     <ImageView 
      android:id="@+id/imageView" 
      android:tag="image_tag" 
      android:layout_width="72dp" 
      android:layout_height="100dp" 
      android:layout_margin="5dp" 
      android:layout_weight="1" 
      android:src="@drawable/one"/> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="12dp" 
      android:layout_weight="2" 
      android:orientation="vertical" 
      > 

      <TextView 
       android:id="@+id/textViewName" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:layout_marginTop="10dp" 
       android:text="Large Text" 
       android:textAppearance="?android:attr/textAppearanceLarge"/> 

      <TextView 
       android:id="@+id/textViewEmail" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       android:layout_marginTop="10dp" 

       android:text="Medium Text" 
       android:textAppearance="?android:attr/textAppearanceMedium"/> 

     </LinearLayout> 
    </LinearLayout> 

</android.support.v7.widget.CardView> 

ниже код для моего адаптера

public class modeladapter extends RecyclerView.Adapter<modeladapter.myholder> { 

    ArrayList<MyModel> arraylist; 
SparseBooleanArray selecteditems; 
    public modeladapter(ArrayList<MyModel> ar) { 
     arraylist=ar; 
     selecteditems=new SparseBooleanArray(); 
    } 

    public void removeData(int position) { 
     arraylist.remove(position); 
     notifyItemRemoved(position); 
    } 

    public MyModel getItem(int position) { 
     return arraylist.get(position); 
    } 

    public void addData(MyModel newModelData, int position) { 
     arraylist.add(position, newModelData); 
     notifyItemInserted(position); 
    } 

    public void toggleSelection(int pos) { 
     if (selecteditems.get(pos, false)) { 
      selecteditems.delete(pos); 
     } 
     else { 
      selecteditems.put(pos, true); 
     } 
     notifyItemChanged(pos); 
    } 

    public void clearSelections() { 
     selecteditems.clear(); 
     notifyDataSetChanged(); 
    } 

    public int getSelectedItemCount() { 
     return selecteditems.size(); 
    } 

    public List<Integer> getSelectedItems() { 
     List<Integer> items = new ArrayList<Integer>(selecteditems.size()); 
     for (int i = 0; i < selecteditems.size(); i++) { 
      items.add(selecteditems.keyAt(i)); 
     } 
     return items; 
    } 





    @Override 
    public modeladapter.myholder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     LayoutInflater lf=LayoutInflater.from(viewGroup.getContext()); 

      View v = lf.inflate(R.layout.card_lay, viewGroup, false); 

//   v.setOnClickListener(Activity_Main.listener); 
      myholder m=new myholder(v); 
      return m; 



    } 


    @Override 
    public void onBindViewHolder(modeladapter.myholder m, int i) { 

       m.cimage.setImageResource(arraylist.get(i).url); 
       m.email.setText(arraylist.get(i).email); 
       m.name.setText(arraylist.get(i).name); 
m.itemView.setActivated(selecteditems.get(i,false)); 

     } 

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

    public static class myholder extends RecyclerView.ViewHolder 
    { 
     ImageView cimage; 
     TextView name,email; 

     public myholder(View itemView) { 
      super(itemView); 
      cimage= (ImageView) itemView.findViewById(R.id.imageView); 
      name= (TextView) itemView.findViewById(R.id.textViewName); 
      email= (TextView) itemView.findViewById(R.id.textViewEmail); 
      if(itemView.isActivated()) 
       itemView.setBackgroundColor(itemView.getContext().getResources().getColor(R.color.primary_dark)); 
      else 
       itemView.setBackgroundColor(Color.parseColor("#ffffff")); 
     } 
    } 

любезно обновить как Я могу изменить цвет фона для выбранных элементов. благодаря

+0

ли вы это решить? –

+0

@ JaredBurrows я смог это сделать. – user2779311

+0

Помог ли мой пост? –

ответ

5

Вы не обязательно должны иметь StateListDrawable Вам нужно иметь метод в адаптер, который проверяет выбора:

sparseArray.valueAt(i).isSelected() 

Затем в RecylcerView.Adapter, изменения:

if (itemView.isActivated()) 
    itemView.setBackgroundColor(itemView.getContext().getResources().getColor(R.color.primary_dark)); 
else 
    itemView.setBackgroundColor(Color.parseColor("#ffffff")); 

To (Вам необходимо изменить cardView, а не itemView):

viewHolder.cardView.setCardBackgroundColor(sparseArray.valueAt(i).isSelected() ? Color.LTGRAY : Color.WHITE); 
+0

Где находится метод проверки выбора, находящегося в адаптере? в ViewHolder() или onBindViewHolder()? Вы можете редактировать выше, чтобы показать пример. – AJW

2

Для тех, кто знаком с этой проблемой, стоит отметить библиотеку поддержки v24, теперь CardView поддерживает ColorStateList. (Примечание: это состояние список цветов, а не рисует состояние списка)

Вот ссылка: https://code.google.com/p/android/issues/detail?id=78198

0

Вместо того чтобы изменять CardView цвета фона, изменить LinearLayout внутри CardView:

<android.support.v7.widget.CardView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/card_view" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
card_view:cardCornerRadius="10dp" 
card_view:cardElevation="10dp" 
android:layout_marginTop="5dp" 
android:layout_marginBottom="5dp" 
android:layout_marginLeft="5dp" 
android:layout_marginRight="5dp"> 


<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    android:background="@drawable/statelist_item_background"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:tag="image_tag" 
     android:layout_width="72dp" 
     android:layout_height="100dp" 
     android:layout_margin="5dp" 
     android:layout_weight="1" 
     android:src="@drawable/one"/> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="12dp" 
     android:layout_weight="2" 
     android:orientation="vertical" 
     > 

     <TextView 
      android:id="@+id/textViewName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_marginTop="10dp" 
      android:text="Large Text" 
      android:textAppearance="?android:attr/textAppearanceLarge"/> 

     <TextView 
      android:id="@+id/textViewEmail" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_marginTop="10dp" 

      android:text="Medium Text" 
      android:textAppearance="? 
      android:attr/textAppearanceMedium"/> 

    </LinearLayout> 
</LinearLayout>