Как сделать так, чтобы не каждый мог использовать ItemTouchHelper? - PullRequest
3 голосов
/ 21 февраля 2020

В моем приложении каждый может добавлять заметки, которые отображаются в RecyclerView.

Я добавил для удаления функциональность в RecyclerView, создав ItemTouchHelper с SimpleCallback и прикрепив его к RecyclerView с помощью метода attachToRecyclerView. В обратном вызове onSwiped я удаляю соответствующий документ из FirestoreDatabase, вызывая delete для него DocumentReference. Это DocumentReference происходит от DocumentSnapshot, вызывая getSnapshots().getSnapshot().getReference() в адаптере и передавая ему позицию.

Моя проблема : я хочу, чтобы пользователь мог удалить только добавленную им заметку, а не любую другую заметку, добавленную другим пользователем. Что такое логика c для реализации этого?

NoteAdapter. java (класс адаптера)

public void deleteItem(int position){
    getSnapshots().getSnapshot(position).getReference().delete();
}

Receive. java (mainacctivity)

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {
        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            Note note = new Note();
            String cuid = FirebaseAuth.getInstance().getCurrentUser().getUid();
                if (note.getUserId().equals(cuid)) {
                    //do nothing;
                } else {
                    return 0;
                }
                return super.getMovementFlags(recyclerView, viewHolder);
        }


        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            adapter.deleteItem(viewHolder.getAdapterPosition());
        }
    }).attachToRecyclerView(recyclerView);
}

Ответы [ 3 ]

3 голосов
/ 21 февраля 2020

Я наконец смог получить решение после прохождения этого и с помощью ответа, предоставленного Тхапой.

Поскольку его ответ был на kotlin, а я разрабатываю свое приложение на Java, мне пришлось поиграться с моим getMovementFlag(), чтобы сделать его похожим на тот, который он предоставил, и внести следующие изменения внутри ItemTouchHelper.SimpleCallback

@Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
                    if (adapter.getSnapshots().get(viewHolder.getAdapterPosition()).getUserId().equals(FirebaseAuth.getInstance().getCurrentUser().getUid())) {
                        //do nothing;
                    }
                    else {
                        return 0;
                    }
                    return super.getMovementFlags(recyclerView, viewHolder);
            }

Еще раз выражаю искреннюю благодарность Тхапе за помощь в этом.

1 голос
/ 21 февраля 2020

@ AaronDCosta Мы можем добавить свойство userId к элементу, который привязывается к RecyclerView. Пожалуйста, обратитесь к следующему фрагменту кода и измените его в соответствии с вашими требованиями.

Класс данных
data class Item(var title: String, var message: String, var userId: String)
Класс адаптера
class SomeAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

var items: List<Item> = emptyList()
    set(value) {
        field = value
        notifyDataSetChanged()
    }

fun getItemAtPosition(position: Int) = items.getOrNull(position)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun getItemCount(): Int {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }}
Прикрепите обратный вызов ItemTouchHelper
fun attachSwipeCallback() {

val adapter: SomeAdapter = SomeAdapter()
val currentUserId = "CurrentUserId"

val itemTouchHelper = object : ItemTouchHelper.Callback() {

    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
        return adapter.getItemAtPosition(viewHolder.adapterPosition)?.let { item ->
            if (item.userId == currentUserId) {
                ItemTouchHelper.LEFT
            } else {
                0
            }
        } ?: 0
    }

    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        TODO("Implement Move")
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        TODO("Implement Swipe")
    }
}}

Надеюсь, это поможет. Пожалуйста, пометьте его как ответ, если оно вам поможет.

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

Вы можете использовать этот метод ItemTouchHelper.Callback Class для строки без прокрутки

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder holder) {
    int position = holder.getAdapterPosition();
    return createSwipeFlags(position);
}

private int createSwipeFlags(int position) {
  return position == 0 ? 0 : super.getSwipeDirs(recyclerView, viewHolder);
}

В этом случае у меня есть сравнение с положением, вы можете проверить здесь существующего пользователя или другого пользователя

...