Список <User>не удаляет объект POJO, который он содержит в адаптере RecyclerView - PullRequest
0 голосов
/ 15 октября 2018

Я читаю данные о пользователях (имя, возраст) из базы данных Firebase и показываю их в виде переработчика.Когда пользователь долго щелкает элемент, этот элемент удаляется из firebase успешно, но когда я пытаюсь удалить этот элемент из списка пользователей, например, List, в методе onChildRemoved дочернего слушателя, пользователь не удаляется.Код:

mChildListener=new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                User user=dataSnapshot.getValue(User.class);
                user.setUid(dataSnapshot.getKey());

                mDataList.add(user);
                mUserAdapter.notifyDataSetChanged();
                //passing the user returned to adapter but didn't work
                mUserAdapter.updateDataSet(user);
            }
            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {  
                User user=dataSnapshot.getValue(User.class);
                user.setUid(dataSnapshot.getKey());

                mDataList.remove(user);
                mUserAdapter.notifyDataSetChanged();
            }
        };

Это класс модели пользователя:

public class User {
    private String uid;
    private String name;
    private int age;
    public User() {}
    public User(String uid, String name, int age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getUid() {return uid;}
    public void setUid(String uid) {this.uid = uid;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}

Код вида переработчика:

@Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        User user=mDataList.get(position);

        holder.textView.setText(user.getName()+ "  |  "+user.getAge());

        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String uid=user.getUid();
                Intent intent=new Intent(mContext,DetailsActivity.class);
                intent.putExtra(USER_KEY,uid);
                mContext.startActivity(intent);
            }
        });
        holder.textView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //this line returns true
                boolean remove = mDataList.contains(user);
                //if I try to remove the user here, its removed
                //this line works as I want
//                mDataList.remove(user);
                Log.d(MainActivity.TAG, "updateDataSet: Contains: "+remove);
                Task<Void> removeUser = NetworkUtils.removeUser(user.getUid());
                removeUser.addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Toast.makeText(mContext, "User removed", Toast.LENGTH_SHORT).show();
                        //mDataList.remove(user);
                        //notifyDataSetChanged();
                    }
                });
                return true;
            }
        });
    }

Я также пытался передатьПользователь вернулся в onChildRemoved к адаптеру, но это также не работает.

public void updateDataSet(User user){
        //this also returns false even the data of this user id displayed
        boolean contains=mDataList.contains(user);
        //this also does not works
        mDataList.remove(user);
        this.notifyDataSetChanged();
    }

Мои вопросы:

1) Как удалить элемент, удаленный при длительном щелчке элемента иза также список просмотра переработчика?

2) У меня List<User> mDataList в MainActivity.java и один в UserAdapter.java.Я передаю mDataList в MainActivity на UserAdapter.Эти два одинаковы в памяти или разные?Если отличается, то как изменение List<user> mDataList в MainActivity (добавление новых элементов в onChildAdded) изменяет List<User> mDataList в UserAdapter?Большое спасибо.Я старался изо всех сил, чтобы очистить мои вопросы, насколько это возможно.

1 Ответ

0 голосов
/ 15 октября 2018

Обновите ваш класс User с помощью метода equals ():

public class User {
    private String uid;
    private String name;
    private int age;
    public User() {}
    public User(String uid, String name, int age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getUid() {return uid;}
    public void setUid(String uid) {this.uid = uid;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof User) {
            User user= (User) obj;
            return uid.equals(user.getUid());
        } else return false;
    }
}

Теперь обновите ваш метод onChildRemoved:

@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) { 
      User user=dataSnapshot.getValue(User.class);
      user.setUid(dataSnapshot.getKey());
      int index = mDataList.indexOf(user);
      mDataList.remove(index);
      mUserAdapter.notifyDataSetChanged();
    }

Примечание. Если uid не существует в mDataList, он вернется-1.

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