Я создаю список с RecyclerView
. Каждый элемент списка - это сообщение от пользователя (прямо сейчас жестко закодировано). Фон для каждого сообщения загружается из XML-файла layer-list
в выпадающей папке.Android RecyclerView не меняет цвет фона на первый элемент программно
Все работает по назначению с текстами и т. Д., Но я пытаюсь изменить цвет фона программно. Он изменяет цвет фона для каждого элемента, за исключением для первого элемента, и я не могу понять, почему.
Первый элемент всегда получает цвет фона, заданный solid
цвета shape
внутри item
называется shape_background
в файле XML, так что не меняется, но следующие пункты получить цвет #ff22ff
.
Это реализация адаптера:
class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.PostViewHolder>{
private LayoutInflater inflater;
private List<PostRow> data = Collections.emptyList();
PostListAdapter(Context context, List<PostRow> data) {
inflater = LayoutInflater.from(context);
this.data = data;
}
@Override
public void onBindViewHolder(PostViewHolder holder, int position) {
PostRow current = data.get(position);
holder.text.setText(current.text.toUpperCase());
holder.time.setText(current.time.toUpperCase());
holder.answers.setText(current.answers.toUpperCase());
try {
// "#ff22ff" will be changed to current.color, unique color for every post
// That string is parsed from a JSON request, hence the try-catch.
int color = Color.parseColor("#ff22ff");
holder.shape.setColor(color);
} catch (Exception e){
e.printStackTrace();
}
}
@Override
public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.post_row, parent, false);
return new PostViewHolder(view);
}
@Override
public int getItemCount() {
return data.size();
}
class PostViewHolder extends RecyclerView.ViewHolder {
TextView text;
TextView time;
TextView answers;
GradientDrawable shape;
PostViewHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
time = (TextView) itemView.findViewById(R.id.time);
answers = (TextView) itemView.findViewById(R.id.answers);
LayerDrawable layers = (LayerDrawable) ContextCompat.getDrawable(itemView.getContext(), R.drawable.bubble);
shape = (GradientDrawable) (layers.findDrawableByLayerId(R.id.shape_background));
}
}
}
Почему фон первого элемента не изменяется, но тексты?
Спасибо заранее!
Есть ли у вас какие-либо исключения? Зачем пытаться поймать? – natario
Я понимаю, что комментарий был недостаточно ясным. Строка с жесткой кодировкой «# ff22ff» будет позже изменена на строку current.color. Эта строка анализируется из ответа JSON. Так что на случай, если что-то запутается в этом процессе, объедините это с помощью try-catch. Я буду обновлять комментарий, спасибо. – Misklahr