从列表中删除项目不从RecyclerView中删除它们?
问题描述:
当我从列表中删除一个项目时,它根本不会从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);
答
删除foreach循环中的项可能会导致取决于集合的未定义行为。
与其说remove
方法是直接在遍历集合您有四个选项:
- 使用Iterator:
final Iterator<User> iterator = mFriendList.iterator();
while(iterator.hasNext()) {
final User user = iterator.next();
if(user.getUid().equals(dataSnapshot.getKey())) {
iterator.remove();
}
}
- 创建另外一个集合,山坳LECT你想所有的项目都删除,然后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(或流支持)流API,特别是过滤()方法:
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()
。
答
鉴于你的代码所提供的有限信息我最好的猜测是,你卸载失败,因为您的数据源不受您从列表中删除的项目的影响。如果不是这样,它会提供更多代码,我很乐意提供帮助。
+0
感谢您的回答,这是使用for循环而不是迭代器的问题。 – Carlton
请添加更多详细代码(如何设置您的适配器等) –
@oguzhand在编辑下添加了它,请检查。还有什么我应该加? – Carlton
您不应该从foreach循环中的集合中删除项目。它可能会导致未定义的行为取决于集合。尝试使用迭代器。 – tommus