0

Мне интересно, можно ли изменить цвет фона для каждого элемента просмотра recycler, если элемент содержит определенное слово. Например, мой пользовательский элемент содержит 4 текстовых поля и 1 флажок, я хочу, чтобы цвет фона был светло-коричневым, если элемент содержит слово «мертвый», красный, если он содержит «скамейку» .. ect ect .. есть способ сделай это?Динамическое изменение цвета заднего вида/карты памяти

Вот мой item.xml:

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


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
android:paddingTop="5dp" 
android:paddingLeft="5dp" 
android:paddingRight="5dp"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="Squat" 
    android:textSize="20sp" 
    android:paddingStart="5dp" 
    android:paddingLeft="5dp" 
    android:paddingRight="50dp" 
    android:id="@+id/txtExercise" 

    /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="%" 
    android:textSize="20sp" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:id="@+id/txtPercentage" 
    android:layout_centerVertical="true" 
    android:layout_toLeftOf="@+id/txtReps" 
    android:layout_toStartOf="@+id/txtReps"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:text="Reps" 
    android:paddingRight="10dp" 
    android:paddingLeft="10dp" 
    android:textSize="20sp" 
    android:id="@+id/txtReps" 
    android:layout_alignTop="@+id/check1" 
    android:layout_toLeftOf="@+id/txtWeight" 
    android:layout_toStartOf="@+id/txtWeight"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Weight" 
    android:paddingRight="10dp" 
    android:paddingLeft="20dp" 
    android:textSize="20sp" 
    android:id="@+id/txtWeight" 
    android:layout_alignParentTop="true" 
    android:layout_toLeftOf="@+id/check1" 
    android:layout_toStartOf="@+id/check1"/> 

<CheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/check1" 
    android:paddingRight="10dp" 
    android:checked="false" 
    android:layout_centerVertical="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true"/> 

</RelativeLayout> 

И мой взгляд утилизатор:

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> { 

Context mContext; 
ArrayList<Workout> workout; 
SharedPreferences prefs; 
int firstSecondOrThird; 


public MyRecyclerAdapter(Context context, ArrayList<Workout> workout, int thePosition) { 
    mContext = context; 
    this.workout = workout; 
    this.firstSecondOrThird = thePosition; 
} 
// INITIALIZE HOLDER 
@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.workout_item, null); 
    MyViewHolder holder = new MyViewHolder(view); 

    return holder; 
} 

//BIND DATA TO VIEWS 
@Override 
public void onBindViewHolder(MyViewHolder holder, final int position) { 
    holder.exercise.setText(workout.get(position).getExercise()); 
    holder.percent.setText(workout.get(position).getPercent()); 
    holder.reps.setText(workout.get(position).getReps()); 
    holder.weight.setText(workout.get(position).getWeight()); 
    holder.check1.setOnCheckedChangeListener(null); 
    final Workout isCheck = workout.get(position); 
    holder.check1.setChecked(isCheck.isCheck1()); 
    prefs = mContext.getSharedPreferences("checkstate", Context.MODE_PRIVATE); 
    holder.check1.setChecked(prefs.getBoolean(firstSecondOrThird+"checkState"+position, false)); 
    isCheck.setCheck1(prefs.getBoolean(firstSecondOrThird+"checkState"+position, false)); 

    holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      isCheck.setCheck1(isChecked); 
      prefs.edit().putBoolean(firstSecondOrThird+"checkState"+position, isChecked).apply(); 
     } 
    }); 

} 

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

Спасибо!

ответ

3

В базе ViewHolder класс, itemView является общедоступным, поэтому в вашем методе onBindViewHolder() вы проверяете, какой цвет вы хотите и установите.

int colorResId = R.color.default; 
    if (workout.get(position).getExercise().contains("bench") { 
     colorResId = R.color.red; 
    // more tests for which color to use 
    } 
    int color = getResources.getColor(colorResId, context); 
    ((CardView) holder.itemView).setCardBackgroundColor(color); 
+0

Чтобы добавить к этому вы можете добавить другое поле в класс 'Workout'. Что-то вроде 'int workOutColor' создает getter и setter, а затем в коде вы можете просто сделать' holder.itemView.setBackgroundResource (workout.get (position) .getWorkOutColor()); ' Это намного чище и делает ваш класс делать логику. –

+0

Спасибо, это работает хорошо, к сожалению, когда я его использую, он в основном избавляется от атрибутов cardview, углы больше не изогнуты и т. Д. Есть ли способ обойти это? – LBJ33

+0

Также кажется, что цвета продолжают меняться lol .. иногда я запускаю приложение и его работу должным образом .. в других случаях он изменит цвета на цвета, которые нигде в моем приложении? – LBJ33

1

Таким образом, ваш ViewHolder имеет связанный с ним View. Что завышено файлом xml, который вы разместили. Теперь в вашем методе onBindViewHolder вы привязываете свои данные к вашему MyViewHolder. Вы можете получить ViewMyViewHolder, позвонив по номеру holder.itemView, который возвращает объект View.

View itemView = holder.itemView; 

Теперь здесь вы можете получить ссылки на ваш TextView, Button и т.д. по телефону findViewById на itemView

Так, например, если у вас в файле XML в TextView с идентификатором android:id="@+id\myTextView вы можете сделать следующее в вашем onBindViewHolder,

public void onBindViewHolder(MyViewHolder holder, final int position) { 
    //..... Other stuff 
    View itemView = holder.itemView; 
    TextView myTextView = (TextView) itemView.findViewById(R.id.myTextView); 
    myTextView.setBackgroundResource(context.getResources().getColor(android.R.color.holo_red_dark)); 
    //...... Other stuff 
} 
+0

Я пытаюсь решить проблему в RecyclerView и наткнулся на ваш ответ выше. Я был бы признателен за любые мысли или идеи для меня по этой проблеме: https://stackoverflow.com/questions/44739404/android-recyclerview-how-do-i-programmtically-select-textview-background-color – AJW

 Смежные вопросы

  • Нет связанных вопросов^_^