从列表中删除项目而不是从RecyclerView中删除它们?

时间:2017-05-03 17:17:54

标签: java android android-recyclerview

当我从列表中删除某个项目时,它根本不会从RecyclerView中删除。

以下是我删除的方法( user.getUid()与dataSnaphot.getkey()相同:

for(User user: mFriendList){
    if(user.getUid().equals(dataSnapshot.getKey())){
        mFriendList.remove(user);
    }
}
friendAdapter.notifyDataSetChanged();

我的用户对象将从列表中删除,但不会从视图中删除。当我使用相同的方法将项目添加到列表中时,例如..

mFriendList.add(user);
friendAdapter.notifyDataSetChanged();

..它确实被添加到列表和视图中。为什么从列表中删除它不能正常工作?

修改

设置RecyclerView(在片段内):

mRecyclerView = (EmptyRecyclerView) rootView.findViewById(R.id.contactRecyclerView);
mRecyclerView.setHasFixedSize(true);

View myView = rootView.findViewById(R.id.emptyAdapterList);
mRecyclerView.setEmptyView(myView);

mLinearLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(mLinearLayoutManager);

mFriendList = new ArrayList<User>();

friendAdapter = new FriendAdapter(mFriendList, getContext());
mRecyclerView.setAdapter(friendAdapter);

2 个答案:

答案 0 :(得分:2)

删除foreach循环中的项目可能会导致未定义的行为,具体取决于集合。

而不是在迭代集合时直接调用remove方法您有四个选项:

final Iterator<User> iterator = mFriendList.iterator();
while(iterator.hasNext()) {
    final User user = iterator.next();
    if(user.getUid().equals(dataSnapshot.getKey())) {
        iterator.remove();
    }
}
  • 创建另一个集合,收集您要删除的所有项目,然后收集removeAll()项:

final Collection toRemove = new ArrayList<User>();
for(User user: mFriendList){
    if(user.getUid().equals(dataSnapshot.getKey())){
        toRemove.add(user);
    }
}
mFriendList.removeAll(toRemove);
  • 使用Java 8(或Stream Support)Streams API,尤其是filter()方法:

mFriendList = mFriendList.stream()
    .filter(user -> !user.getUid().equals(dataSnapshot.getKey()))
    .collect(Collectors.toList());
  • 使用RxJava(或RxJava 2)过滤:

mFriendList =  Single.just(mFriendList)
    .flatMapIterable(identity()) // list -> list
    .filter(user -> !user.getUid().equals(dataSnapshot.getKey()))
    .toList()
    .blockingGet(); // or whatever transformation

取决于您是否使用被动方法我强烈建议您使用最新的方法来保持一致性,或者只是为了从流支持库中删除依赖项,如果您的目标是足够老的Android SDK。

请记住,只要您完成修改,就必须notifyDataSetChanged()

答案 1 :(得分:1)

鉴于您的代码提供的信息有限,我最好的猜测是您的删除失败,因为您的数据源不受列表中已删除项目的影响。如果不是它提供更多代码,我将很乐意提供帮助