Удалите список повторного просмотра, содержащий указанный c Идентификатор пользователя Firebase, используя Geoquery onKeyExited - PullRequest
0 голосов
/ 09 апреля 2020

Привет! Я пытаюсь удалить элемент списка повторного просмотра, содержащий идентификатор пользователя firebase или соответствующие элементы в GeoQuery onKeyExited. Тем не менее, я не могу найти способ выполнить его.

списочные элементы добавляются через firebase

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
                    @Override
                    public void onKeyEntered(String key, final GeoLocation location) {

                        ListOnline usersOnlineList = new ListOnline(user.getBio(), user.getName(), user.getAvatarUrl(), user.getToken());
                        usersList.add(usersOnlineList);
                        usersAdapter.notifyDataSetChanged();

                    }

Я пытался

public void onKeyExited(String key) {
                        if (geoQuery != null) {
                            geoQuery.removeAllListeners();
                        }

                        usersList.clear();
                        usersAdapter.notifyDataSetChanged();


                    }

, но это удаляет все элементы

Я пытался

@Override
                public void onKeyExited(String key) {

                    usersList.remove(position);
                    notifyItemRemoved(position);

                }

это удаляет только последнюю позицию элемента

я пытался

@Override
                public void onKeyExited(String key) {

                    if (usersList.contains(key)){
                        usersList.remove(position);
                        notifyItemRemoved(position);
                    }

                }

, но это ничего не удаляет

Я пытался setTag (позиция), это дает правильную позицию номер для каждого списка

public class OnlineUserAdapter extends RecyclerView.Adapter<OnlineUsers.OnlineUserAdapter.ViewHolder> {

    private List<ListOnline> usersList;
    private Context context;
    private View view;
    private ViewHolder holderr;

    public OnlineUserAdapter(List<ListOnline> usersList, Context context, View view) {
        this.usersList = usersList;
        this.context = context;
        this.view = view;
    }

    @Override
    public OnlineUsers.OnlineUserAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(context).inflate(R.layout.item_online_user,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(OnlineUsers.OnlineUserAdapter.ViewHolder holder, final int position) {
        holderr=holder;
        holder.name.setText(usersList.get(holder.getAdapterPosition()).getBio());

        holder.username.setText(getString(R.string.at)+usersList.get(position).getUsername());

        Glide.with(context.getApplicationContext())
                .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.alien))
                .load(usersList.get(holder.getAdapterPosition()).getImage())
                .into(holder.image);

        holder.itemView.setTag(position);

        if (geoQuery != null){
            geoQuery.removeAllListeners();
            geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
                @Override
                public void onKeyEntered(String key, final GeoLocation location) {

                    ListOnline usersOnlineList = new ListOnline(user.getBio(), user.getName(), user.getAvatarUrl(), user.getToken());
                    usersList.add(usersOnlineList);
                    usersAdapter.notifyDataSetChanged();

                }
                @Override
                public void onKeyExited(String key) {

                    int position = (Integer) holder.itemView.getTag();
                    usersAdapter.deleteItem(position);
                    usersList.remove(position);
                    notifyItemRemoved(position);

                }
                @Override
                public void onKeyMoved(String key, GeoLocation location) {
                }
                @Override
                public void onGeoQueryReady() {
                }
                @Override
                public void onGeoQueryError(DatabaseError error) {
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return usersList.size();
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        CircleImageView image;
        View            mView;
        TextView        name, listenerText,username;

        ViewHolder(View itemView) {
            super(itemView);

            mView =itemView;
            image = mView.findViewById(R.id.image);
            name = mView.findViewById(R.id.name);
            username = mView.findViewById(R.id.username);
            listenerText = mView.findViewById(R.id.view_foreground_text);

        }

    }

    private void deleteItem(int position) {
        usersList.remove(usersList.get(position));
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, usersList.size());
        notifyDataSetChanged();
    }
}

, но при этом снова удаляется только последняя позиция

Пожалуйста, помогите СПАСИБО ЗА ПРЕДЕЛА!

Обновление 4/13/20

Я нашел способ сделать это! В заключение! Предполагая, что вы используете модель списка для заполнения вьюблера, посмотрите на onKeyExited.

@Override
public void onBindViewHolder(OnlineUsers.OnlineUserAdapter.ViewHolder holder, final int position) {
    holder.name.setText(usersList.get(holder.getAdapterPosition()).getBio());

    holder.username.setText(getString(R.string.at)+usersList.get(position).getName());

    Glide.with(context.getApplicationContext())
            .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.alien))
            .load(usersList.get(holder.getAdapterPosition()).getAvatarUrl())
            .into(holder.image);

    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, final GeoLocation location) {
        }
        @Override
        public void onKeyExited(String key) {
            if(holder.getAdapterPosition()!=-1){
                if (usersList.get(holder.getAdapterPosition()).getToken().equals(key)){
                    usersList.remove(usersList.get(holder.getAdapterPosition()));
                    notifyItemRemoved(holder.getAdapterPosition());
                    notifyItemRangeChanged(holder.getAdapterPosition(),usersList.size()-1);
                    notifyDataSetChanged();
                }
            }
        }
        @Override
        public void onKeyMoved(String key, GeoLocation location) {
        }
        @Override
        public void onGeoQueryReady() {
        }
        @Override
        public void onGeoQueryError(DatabaseError error) {
        }
    });
}

Надеюсь, что это поможет другим, убедитесь, что

if(holder.getAdapterPosition()!=-1){
    if (usersList.get(holder.getAdapterPosition()).getToken().equals(key)){
        usersList.remove(usersList.get(holder.getAdapterPosition()));
        notifyItemRemoved(holder.getAdapterPosition());
        notifyItemRangeChanged(holder.getAdapterPosition(),usersList.size()-1);
        notifyDataSetChanged();
    }
}

очень важно вычесть из списка видоискатель!

notifyItemRangeChanged(holder.getAdapterPosition(),usersList.size()-1);
...