簡體   English   中英

如何關閉 recyclerview 適配器中的 localbroadcast 偵聽器? 有沒有更好的方法來與從它調用的活動進行通信?

[英]How can I turn off localbroadcast listener in recyclerview adapter? Of is there a better way to communicate with an activity called from it?

我是 SO 新手,對編碼也很陌生,所以如果我在這里違反規則或期望,請提前接受我的道歉。

我有一個不尋常的設置,涉及兩個 recyclerViews,我將在這里解釋,並粘貼下面代碼的簡化版本(因為與這個問題無關)。

在我將稱為verticalRecyclerViewActivity 中,調用verticalRecyclerViewAdapter,它從Firebase 獲取數據並加載到arrayLists。

如果用戶單擊垂直 recyclerview 中的項目,我將調用的新對話框片段 HorizontalRecyclerViewDialogFragment 會膨脹,並加載我將調用的 HorizontalRecyclerView (它具有與垂直的相似的項目,更詳細地說,帶有選項單擊它們以查看它們)。

如果用戶單擊 HorizontalRecyclerView 中的項目,我將調用 reviewItem 的新活動(通過 Intent)啟動。 當用戶提交他們的評論時,它完成並(通過 backstack)返回到水平的 RecyclerView。 如果他們在沒有實際提交評論的情況下按下后退按鈕,也會發生這種情況。 這一切都很好,但我需要 HorizontalRecyclerView 來表明他們已經(或沒有)審查過該項目和 state 他們在審查中給出的分數。

調用 notifyDataSetChanged 對此不起作用,因為信息如何通過兩個 recyclerViews 和 Firebase 調用(或者,至少,它會非常低效)。

我試過使用 startActivityForResult (我知道它已被棄用,但如果我可以讓它工作,我可以嘗試使用我還不理解的較新的等價物)但問題是結果返回到原來的(VerticalRecylcerView)活動,它是兩個 recyclerView 適配器和一個片段,需要更新,我不知道如何將該數據傳遞給水平 Recyclerview。

我也嘗試過使用接口,但無法通過 Intent 傳遞它(嘗試使用 Parcelable 和 Serializable,但在這種情況下似乎兩者都不起作用?)。

由於評論是在 Firebase 上更新的,我可以讓水平 Recyclerview 監聽更改,但這似乎效率很低?

所以我找到了一個使用 localBroadcast 的解決方案(我知道它也被棄用了)。 Intent(帶有評論分數)在水平 recyclerView 適配器中被審查和接收時被傳輸。 但是我應該何時以及如何注銷適配器? 理想情況下,接收器將在用戶進入 Review 活動時打開,並在用戶從該活動返回並且(水平)recyclerView 持有人更新時關閉,無論評論是否成功提交或用戶是否只是按下后退按鈕並且從不提交評論。

我的問題與此類似: 如何從另一個 class 注銷和注冊 BroadcastReceiver?

這與此重復: 如何從另一個 class 注銷和注冊 BroadcastReceiver?

這些問題有很多我不明白的地方,但我認為他們和我的案例之間的重要區別是,我只想讓接收者知道何時提交評論,最好在那時取消注冊,或者可能在 viewHolder被回收,我嘗試過但也沒有工作,因為它沒有連接到 viewHolder(應該是嗎?)。

任何幫助將不勝感激,謝謝!

public class verticalRecyclerViewActivity extends AppCompatActivity {
            
// Loads an XML file and assembles an array from Firebase. 
            
mVerticalRecyclerView = findViewById(R.id.verticalRecyclerView);
            
verticalRecyclerViewAdaptor mVerticalRecyclerViewAdaptor  = new verticalRecyclerViewAdaptor (this); // also pass other information it needs
        
            
mVerticalRecyclerView .setAdapter(mVerticalRecyclerViewAdaptor);

}
        
        
public class verticalRecyclerViewAdaptor extends RecyclerView.Adapter<verticalRecyclerViewAdaptor.singleHolder> {
        
// Usual recyclerView content
        
holder.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

horizontalRecyclerViewFragment  mHorizontalRecyclerViewFragment = new horizontalRecyclerViewFragment();  

// lots of arguments passed it needs. 
        
FragmentManager fragmentManager = ((FragmentActivity) view.getContext()).getSupportFragmentManager();
        
mHorizontalRecyclerViewFragment.show(fragmentManager, null);
                                    
}
    
public class mHorizontalRecyclerViewFragment extends DialogFragment {
    
public Dialog onCreateDialog(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
    
mContext = getActivity().getApplicationContext(); // Not sure why I need this, but it works. 
    
View horizontalRecyclerViewView = getActivity().getLayoutInflater().inflate(R.layout.horizontal_recyclerview_holder, new CardView(getActivity()), false);

Dialog horizontalRecyclerViewDialog = new Dialog(getActivity());
            
horizontalRecyclerViewDialog.setContentView(horizontalRecyclerViewView);

mHorizontalRecyclerView = horizontalRecyclerViewView.getRootView().findViewById(R.id.horizontalRecyclerView);    
    
mHorizontalRecyclerViewAdapter  = new horizontalRecyclerViewAdapter (mContext) 
// Other arguments passed
    
mHorizontalRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), 

LinearLayoutManager.HORIZONTAL, false));

mHorizontalRecyclerView.setAdapter(mHorizontalRecyclerViewAdapter);
          
}
    
public class horizontalRecyclerViewAdapter extends RecyclerView.Adapter<horizontalRecyclerViewAdapter.horizontalRecyclerViewHolder> {
    
    
public horizontalRecyclerViewAdapter(){}
    
// Blank constructor and also one with lots of arguments for it to work. 
    
public horizontalRecyclerViewAdapter.horizontalRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal_recyclerview_adaptor_holder, parent, false);

return new horizontalRecyclerViewAdapter.horizontalRecyclerViewHolder(view);

}
    
public void onBindViewHolder(@NonNull horizontalRecyclerViewHolder holder, int position) {
    
    
// Connect up various views. 
    
holder.setOnClickListener(new View.OnClickListener() {
                
@Override
public void onClick(View view) {
    
LocalBroadcastManager.getInstance(mContext).registerReceiver(reviewSubmittedListener, new IntentFilter("reviewSubmitted"));
    
Intent reviewNow = new Intent(view.getContext(), ReviewActivity.class);
    
// Put extra details with the intent
    
view.getContext().startActivity(reviewNow);
    
}
    
BroadcastReceiver reviewSubmittedListener = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent reviewFinishedIntent) {
                       
int reviewScore = reviewFinishedIntent.getExtras().getInt("reviewScore");
                        

// Update the horizontal RecyclerView with the information received from the review Activity. 

}
};

}
    
public class ReviewActivity extends AppCompatActivity {
    
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_review_item);
    
// Set up the review, using Firebase and data passed through the intent.  
    
}
    
public void submitReview() {
    
// Check that the review is complete/valid and submit it through Firebase
    
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(ReviewItemActivity.this);

Intent reviewFinishedIntent = new Intent("reviewSubmitted");
    
reviewFinishedIntent.putExtra("reviewScore", overallScore);

    
LocalBroadcastManager.getInstance(this).sendBroadcast(reviewFinishedIntent);
    
finish();
    
}

如果您使用的是RxJava ,則可以使用RxBus ,否則您可以為此使用許多EventBus實現之一。

如果這不是您想要采用的路徑,那么您可以擁有一個共享視圖 model object 只能用於片段之間的通信,請參閱本文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM