2017-05-03 217 views
1

当我从列表中删除一个项目时,它根本不会从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); 
+0

请添加更多详细代码(如何设置您的适配器等) –

+0

@oguzhand在编辑下添加了它,请检查。还有什么我应该加? – Carlton

+0

您不应该从foreach循环中的集合中删除项目。它可能会导致未定义的行为取决于集合。尝试使用迭代器。 – tommus

回答

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(); 
    } 
} 
  • 创建另外一个集合,山坳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

再次感谢!我还会尝试使用lambda,因为我需要更多地使用它:) – Carlton

+0

我已经添加了代码示例,其中包括响应式方法。很高兴我能帮上忙。 :) – tommus

+0

谢谢你的样品,非常有帮助!我想知道,我如何启用Java8的使用?当我尝试使用它时,我得到这个错误“API的使用记录为@since 1.8 + ...”,我找不到在设置中启用它的方法? – Carlton

1

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

+0

感谢您的回答,这是使用for循环而不是迭代器的问题。 – Carlton