Как обновить элемент в представлении переработчика с помощью обратного вызова элемента diff? - PullRequest
0 голосов
/ 30 марта 2019

Я реализую представление переработчика, используя библиотеку базы данных комнаты. Я хотел бы перечислить мои пункты и чтобы их можно было редактировать, нажав. После повторной отправки элемента, вернитесь снова к списку и покажите элементы + изменения.

В настоящее время я использую функцию обратного вызова DiffUtil для сравнения старого и нового списков. Я думаю, что проблема здесь. У моего элемента Dto есть 4 поля.

  • id title image arraylist

Таким образом, когда пользователь редактирует элемент, список должен обновлять строку пользовательского интерфейса (заголовок, изображение или / и массив)

Это мой адаптер.

private OnItemClickListener listener;

public ExercicioAdapter() {
    super(DIFF_CALLBACK);
}

private static final DiffUtil.ItemCallback<Exercicio> DIFF_CALLBACK = new DiffUtil.ItemCallback<Exercicio>() {
    @Override
    public boolean areItemsTheSame(@NonNull Exercicio oldExercicio, @NonNull Exercicio newExercicio) {
        return oldExercicio.getId() == newExercicio.getId();
    }

    @Override
    public boolean areContentsTheSame(@NonNull Exercicio oldExercicio, @NonNull Exercicio newExercicio) {
        return oldExercicio.getTitulo().equals(newExercicio.getTitulo()) &&
                Float.compare(oldExercicio.getMaxPeso(), newExercicio.getMaxPeso()) == 0;
    }
};

@NonNull
@Override
public MyHolderView onCreateViewHolder(@NonNull ViewGroup parent, int i) {
    View           view;
    LayoutInflater mInflater = LayoutInflater.from(parent.getContext());
    view = mInflater.inflate(R.layout.exercicios_item, parent, false);
    return new MyHolderView(view);
}

@Override
public void onBindViewHolder(@NonNull MyHolderView exercicioHolder, final int i) {
    Exercicio exercicio = getItem(i);

    // Mostrar a informacion do obxeto.
    ArrayList<Repeticion> repeticions = exercicio.getRepeticions();
    float                 peso_max    = 0f;
    if (repeticions != null && repeticions.size() > 0) {
        for (Repeticion rep : repeticions) {
            if (rep.getPeso() > peso_max) {
                peso_max = rep.getPeso();
            }
        }
    }
    exercicioHolder.nome.setText(exercicio.getTitulo());
    String peso_str = exercicioHolder.itemView.getContext().getString(R.string.peso_max);
    exercicioHolder.peso.setText(peso_str + " " + Float.toString(peso_max));

    if (exercicio.getImaxe() != null && exercicio.getImaxe().length != 0) {
        exercicioHolder.imx_exercicio.setImageBitmap(convertByteArrayToBitmap(exercicio.getImaxe()));
    }
}

public Exercicio getExercicioAt(int position) {
    return getItem(position);
}

public class MyHolderView extends RecyclerView.ViewHolder {
    TextView  nome;
    TextView  peso;
    ImageView imx_exercicio;
    CardView  exercicio_cardview;

    MyHolderView(@NonNull View itemView) {
        super(itemView);
        exercicio_cardview = itemView.findViewById(R.id.exercicio_cardview);
        nome = itemView.findViewById(R.id.nome);
        peso = itemView.findViewById(R.id.peso);
        imx_exercicio = itemView.findViewById(R.id.imx_exercicio);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = getAdapterPosition();
                if (listener != null && position != RecyclerView.NO_POSITION) {
                    listener.onItemClick(getItem(position));
                }
            }
        });
    }
}

public interface OnItemClickListener {
    void onItemClick(Exercicio exercicio);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    this.listener = listener;
}

Проблема: при обновлении элемента, например, при изменении заголовка список обновляется, но отредактированный элемент исчезает. Если я заканчиваю действие и запускаю его снова, обновленный элемент уже есть. Так что проблема должна быть в обратном вызове diff, но я не могу заставить его работать. Извините за мой английский, это не мой основной язык, спасибо всем!

1 Ответ

0 голосов
/ 31 марта 2019

Скорее всего, вы неправильно используете функцию DiffUtil.Сначала необходимо рассчитать diff, а затем отправить обновления адаптеру, после чего он обновит ваш адаптер новыми данными.Используйте DiffUtil.Callback() и , а не DiffUtil.ItemCallback()

DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
            @Override
            public int getOldListSize() {
                // old list size, which is same as new in your case
            }

            @Override
            public int getNewListSize() {
                // new list size, which is same as old in your case
            }

            @Override
            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition)
            }

            @Override
            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
            }
)

result.dispatchUpdatesTo(this); // this parameter is your Recycler View's adapter

Подробнее о Diff Util можно узнать здесь и здесь

Дайте мне знать, если у вас все еще есть сомнения.Спасибо.

...