0

我有一個RecyclerView的片段,用RxJava2作爲this SO answer解釋項的點擊進行處理,這是在非片段工作的罰款。RecyclerView項目點擊

private PublishSubject<Place> itemViewClickSubject = PublishSubject.create(); 

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_result_view, parent, false); 

     ViewHolder viewHolder = new ViewHolder(view); 

     // convert click events into reactive stream 
     RxView.clicks(view) 
       .takeUntil(RxView.detaches(parent)) 
       // viewHolder.getPlace() is null until it get bound 
       .map(__ -> viewHolder.getPlace()) 
       .subscribe(itemViewClickSubject); 

     return viewHolder; 
    } 

當片段中的RecyclerView工作正常只有一次。在項目單擊片段被替換爲另一個片段。在回按之後,RecyclerView片段出現,但點擊不再起作用。

它可以工作,如果我刪除.takeUntil(RxView.detaches(parent))行。我認爲當它不顯示(分離)時,需要打破RxView click與RecyclerView的強大綁定。我該如何解決這個問題?我正在尋找解決問題使用附加/分離事件之一,任何建議將是偉大的!謝謝。

+1

你應該設置單擊onBindViewHolder – Wrobel

+0

@Wrobel感謝您的建議,它的偉大工程。我仍然對使用'.takeUntil(RxView.detaches(parent))'部分感到困惑。在原來的答案中使用它的原因是什麼?現在我認爲,既然它沒有做任何退訂,那麼把這部分放在第一位是沒有意義的。請糾正我。 –

+0

因爲您需要使用takeUntil()來避免內存泄漏 – Wrobel

回答

2

要回答你的問題和意見,我把我的整個解決方案的RecylerView + RxJava:

private PublishSubject<Place> itemViewClickSubject = PublishSubject.create(); 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 
    RxView.clicks(viewHolder.itemView) //viewHolder.itemView here You have access to view 
      .map(aVoid -> viewHolder.getPlace()) 
      .subscribe(itemViewClickSubject); 
} 

@Override 
public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 
    itemViewClickSubject.onCompleted(); //here we avoid memory leaks 
} 
+0

不是'onComplete()'方法嗎?你在哪裏取消訂閱RxView.clicks? – Shujito

相關問題