2017-05-03 301 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