0

我加載通過以下方法基於火力地堡數據recyclerview:RecyclerView上覆制返回按

@Override 
public void onStart() { 
    super.onStart(); 
    mChildEventListener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      String newPollEpoch = dataSnapshot.getKey(); 
       if (mNewPollsAray.contains(newPollEpoch)) { 
        Log.v("POLL_ADDED", "POLL ADDED: " + newPollEpoch); 
       } else { 
        Log.v("Child_Added", "The new child is " + newPollEpoch); 
        String newPollImageURL = dataSnapshot.child(IMAGE_URL).getValue(String.class); 
        //TODO: On additional devices, numbesr are not appearing as the question 
        String newPollQuestion = dataSnapshot.child(QUESTION_STRING).getValue(String.class); 
        String convertedQuestion = newPollQuestion.toString(); 
        mNewPollsAray.add(0, new Poll(convertedQuestion, newPollImageURL, newPollEpoch)); 
        mNewPollsAdapter.notifyDataSetChanged(); 
        Log.v("OnChildChanged", "OnCHILDCHANGEDCALLED " + dataSnapshot.getKey()); 
       } 

      } 



     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 
    mPollsRef.addChildEventListener(mChildEventListener); 

} 

@Override 
public void onStop() { 
    super.onStop(); 
    mPollsRef.removeEventListener(mChildEventListener); 
} 

這裏是我打電話單擊在recyclerview項目時的方法:

@Override 
     public void onClick(View view) { 
      view.getId(); 
      int itemPosition = getAdapterPosition(); 
      String passEpoch = mNewPollsAray.get(itemPosition).getPollID(); 
      Log.v("PASSED_ID", "The passed ID is " + passEpoch); 
      Intent toPoll = new Intent(getActivity(), PollHostActivity.class); 
      toPoll.putExtra("POLL_ID", passEpoch); 
      startActivity(toPoll); 
     } 

我從它加載的片段是TabLayout的一部分。當我在標籤之間導航時,recyclerview正確加載。

但是,當我點擊recyclerview中的項目(這會將我帶到新活動中),然後導航回包含recyclerview的片段時,項目會被重複並且recyclerview項目全部無序。我認爲這與onStart()被多次調用並且基本上將新項目「堆疊」到回收站視圖而不是替換它們相關,但是我希望能夠確認。

+0

你能在片段onCreateView()函數張貼代碼。 – Swapnil

回答

1

您可以嘗試使用代碼,我遇到類似的問題得到解決與波紋管的變化。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if(mMainLayout == null) 
    { 
     mMainLayout = inflater.inflate(R.layout.fragment_main, container,false); 
... 
    } 
    return mMainLayout; 
} 

當mMainlayout不爲空,這意味着你的片段實例已具有mMainLayout的一個實例,已經加入到容器的ViewGroup不需要重新添加。您可能會遇到問題,因爲您正在向同一個容器重新添加相同的視圖。

1

發生這種情況是因爲您添加了偵聽器,但從不刪除它。因此,下一次當您進入視圖時,您將添加第二個偵聽器,從而爲數據庫中的每個項目獲取兩個onChildAdded()的調用。

解決方法是在退出視圖時刪除偵聽器。既然你在onStart()連接監聽器,你應該在onStop()再次將其刪除:

@Override 
public void onStop() { 
    mPollsRef.removeEventListener(mChildEventListener); 
} 
+0

我確實有這個代碼來刪除它。有趣的是,只有當我通過onBackPressed()回到片段時,它纔會複製和重新排序我的ArrayList(),它觸發notiftyDataSetChanged()並填充recyclerview。我嘗試了另一種仍然導致重複的方式,請參閱更新代碼 – tccpg288

+1

原因仍然可能是相同的:在導航時,您不會刪除偵聽器,因此在視圖返回時添加另一個偵聽器。我建議在調試器中設置斷點以查看偵聽器刪除是否觸發。 –