Удаление строки RecyclerView с видимой кнопкой не работает должным образом - PullRequest
0 голосов
/ 02 февраля 2020

Итак, у меня есть странная ошибка, которую, я думаю, я внес в свой код. Он включает в себя RecyclerView.

Поэтому, когда пользователь хочет удалить строку в моем приложении, должно произойти следующее:

  1. Пользователь долго нажимает на строку
  2. Удалить строку кнопка становится видимой.
  3. Пользователь нажимает кнопку, чтобы удалить строку.
  4. Отображается диалоговое окно подтверждения (это еще не реализовано, но должно быть простым).
  5. Если пользователь подтверждает, удалите строку из RecyclerView и обновите.

Теперь я могу получить шаги с 1 по 5, работающие для каждой строки ... Однако, если я удаляю более одной (обычно две) строк, что-то странное происходит, несколько строк вниз, появляется кнопка «Удалить проект», и если я долго нажимаю любую другую строку (и ту, о которой идет речь), видимые кнопки переворачиваются. (Если это имеет смысл?)

Как мне предотвратить это? Вот мой код:

MainActivity. java:

public class MainActivity extends AppCompatActivity implements ProjectListAdapter.ItemClickListener {
    ...
    @Override
    public void onItemLongClick(View view, int position) {
        mPLA.onRowLongClick(position, mRV_ProjectList);
    }
    ...
}

ProjectListAdapter. java:

public class ProjectListAdapter extends RecyclerView.Adapter<ProjectListAdapter.ViewHolder> {
    ...
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, final in position) {
        ...
        holder.b_deleteProject.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onButtonDeletePress(position);
            }
        });
    }
    ...
    public void onDeleteButtonPress(int position) {
        if(getItem(position) != null) {
            ProjectManager.getInstance().removeProject(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, ProjectManager.getInstance().getProjectListSize());
        }
    }
    ...
    public void onRowLongClick(int position, RecyclerView rv) {
        ViewHolder holder = (ViewHolder) rv.findViewHolderForAdapterPosition(position);
        holder.setDeleteProjectButtonVisibility();
    }
    ...
}

В классе ViewHolder в ProjectListAdapter. java имеет:

public void setDeleteProjectButtonVisibility() {
    if(b_deleteProject.getVisibility() == Button.VISIBLE) { b_deleteProject.setVisibility(Button.GONE); }
    else if (b_deleteProject.getVisibility() == Button.GONE) { b_deleteProject.setVisibility(Button.VISIBLE); }
    else { b_deleteProject.setVisibility(Button.GONE); }
}

Это все, что я думаю, связано с этой проблемой, если это не так, я могу доказать дальнейший код.

Я почесываю голову в данный момент, как к тому, что вызывает это (весьма вероятно, что я что-то не так делаю).

Спасибо!

1 Ответ

0 голосов
/ 02 февраля 2020

Я полагаю, что вы можете сделать это, взяв один логический элемент в вашей модели и обработав видимость только для этой конкретной позиции.

Пример: используйте один логический тип, подобный isDeleteProject, в вашей модели. Затем используйте getter setter, чтобы изменить значение в соответствии с вашими требованиями, как показано ниже.

  public void onRowLongClick(int position, RecyclerView rv) {
    ViewHolder holder = (ViewHolder) rv.findViewHolderForAdapterPosition(position);
    mRV_ProjectList.get(position).setIsDeleteProject(true);
    holder.setDeleteProjectButtonVisibility(position);
}


public void setDeleteProjectButtonVisibility(int Position) {
if(mRV_ProjectList.get(position).isDeleteProject())
 {
     b_deleteProject.setVisibility(Button.VISIBLE)
     mRV_ProjectList.get(position).setIsDeleteProject(false);
 }

Также по умолчанию в xml make отсутствует видимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...