Итак, я следовал этому руководству отсюда:
https://www.freecodecamp.org/news/how-to-implement-swipe-for-options-in-recyclerview/
И все выглядит так, как будто все работает нормально, но у меня есть 1 проблема, о которой я не знаю как исправить.
В одной строке у меня есть два разных держателя, один из которых показывает меню со всеми параметрами, а другой - заголовок (как вы можете видеть на изображении ниже с 1 и 2).
Как видно из кода ниже, цвет строки зависит от того, завершена строка или нет. Если он завершен, он окрашивает весь фон в светло-зеленый цвет. Один из вариантов в меню - отменить (если он был завершен), чтобы он вернулся к цвету по умолчанию. Вот как это выглядит
Вот функция onBindViewholder, как вы можете видеть в начале, я вызываю bindView (position), где он окрашивает фон, но тогда я не знаю как вызвать его снова:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
final Task entity = list.get(position);
if(holder instanceof MyViewHolder){
((MyViewHolder)holder).title.setText(entity.getName());
((MyViewHolder)holder).bindView(position);
((MyViewHolder)holder).container.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showMenu(position);
return true;
}
});
}
if(holder instanceof MenuViewHolder){
((MenuViewHolder)holder).complete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
Task_Completed(entity.getId(), entity.getPoints());
updateTaskList (list);
closeMenu();
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}
});
((MenuViewHolder)holder).undo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
entity.setCompleted(0);
//((MyViewHolder) holder).container.setBackgroundColor(Color.parseColor("#567845"));
Undo_Complete(entity.getId(), entity.getPoints());
updateTaskList (list);
closeMenu();
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}
});
((MenuViewHolder)holder).delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
delete_task(entity.getId());
list.remove(entity);
updateTaskList (list);
closeMenu();
break;
case DialogInterface.BUTTON_NEGATIVE:
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
}
});
}
}
Вот класс держателей с методом bindView:
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView title;
ConstraintLayout container;
LinearLayout background;
public MyViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
container = itemView.findViewById(R.id.container);
background = (LinearLayout) itemView.findViewById((R.id.linearLayout3));
}
public void bindView(int pos) {
int value = list.get(pos).getCompleted();
if(value == 1 ) {
container.setBackgroundColor (ContextCompat.getColor(context, R.color.light_green));
}
}
}
public class MenuViewHolder extends RecyclerView.ViewHolder{
ImageView complete, delete, undo;
// ConstraintLayout container;
public MenuViewHolder(View view){
super(view);
complete = view.findViewById(R.id.Complete);
undo = view.findViewById(R.id.Undo);
// container = itemView.findViewById(R.id.container);
delete = view.findViewById(R.id.Delete);
}
}