Привет! Я пытаюсь удалить элемент списка повторного просмотра, содержащий идентификатор пользователя 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);