Я искал везде, и, кажется, никто не мог мне помочь, вот что я сделал, и это сработало для меня. Надеюсь, это поможет.
Я изменил фрагмент B (TopBarFragment) на активность (TopBarActivity)
Причина, по которой я изменил фрагмент на активность, заключается в том, что я хотел целые Адаптеры RecyclerView для остановки прослушивания, когда пользователь направляется на активность TopBar. Таким образом, я могу инициировать новый адаптер по возвращении в Activity, которая содержит RecyclerViews.
План
- Создайте два набора адаптеров (один для defaultAdapter другое для того, что пользователь нажимает на TopBarActivity. давайте назовем его menuItemAdapter).
- Дополнительные функции для отправки строк из TopBarActivity при щелчках пользователя в MainActivity. Затем фрагменты будут проверять строки MainActivity.
- Создать два метода переопределения (onPause & onResume), чтобы либо прекратить прослушивание адаптеров, либо начать их прослушивание. Здесь мы создадим условия для прослушивания адаптеров по умолчанию или прослушивания того, что пользователь нажимает. Эти условия проверят, существуют ли строки в точке 2 или нет. Если он существует, прослушайте menuItemAdapter, если строки не существуют, затем прослушайте defaultAdapters.
Код TopBarActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_top_bar);
//I am using Recycler view to display the menu item lists on this activity.
//RecyclerView Codes goes here
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getBaseContext(), MainActivity.class);
i.putExtra("CHOSENITEM", (model.getItemName()));
startActivity(i);
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private String choicesName = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
setupTopBarStringListener();
}
private void setupTopBarStringListener() {
choicesName = getIntent().getStringExtra("CHOSENITEM");
}
public String ChoicesString() {
return choicesName;
}
}
String ChoicesString () затем будет вызываться во фрагменте A
фрагмент A, код
public class QuestionFragment extends Fragment {
private String myStringFromActivity;
RecyclerView contentListRv;
FirebaseRecyclerOptions options, newoptions;
FirebaseRecyclerAdapter<Post, PostsViewHolder> adapter, newadapters;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
Log.i(TAG, "onViewCreated: restart");
contentListRv= view.findViewById(R.id.contentListRv);
contentListRv.setLayoutManager(new LinearLayoutManager(getContext()));
HomeActivity activity = (HomeActivity) getActivity();
myStringFromActivity = activity.ChoicesString();
Log.i(TAG, "choices from activity= " + myStringFromActivity);
}
}
Добавить рециркуляторы по умолчанию к фрагменту A
public void setupRecyclers() {
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dschild : dataSnapshot.getChildren()) {
String location = "" + dschild.child("location").getValue();
Query query = questionReference.orderByChild("location").equalTo(location);
options = new FirebaseRecyclerOptions.Builder<Question>()
.setQuery(query, Post.class)
.build();
adapter = new FirebaseRecyclerAdapter<Post, PostsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull Question model) {
holder.username.setText(model.getUsername());
}
@NonNull
@Override
public QuestionsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.snippet_posts_view, viewGroup, false);
PostsViewHolder viewHolder = new PostsViewHolder(view);
return viewHolder;
}
};
contentListRV.setAdapter(adapter);
adapter.startListening();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Затем добавить к пункту A меню Recycler элементы
public void menuItemRecyclers() {
Query query2 = questionReference.orderByChild("tags").equalTo(myStringFromActivity);
newoptions = new FirebaseRecyclerOptions.Builder<Question>()
.setQuery(query2, Post.class)
.build();
newadapters = new FirebaseRecyclerAdapter<Post, PostsViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull Question model) {
holder.username.setText(model.getUsername());
}
@NonNull
@Override
public QuestionsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.snippet_posts_view, viewGroup, false);
PostsViewHolder viewHolder = new PostsViewHolder(view);
return viewHolder;
}
};
contentListRV.setAdapter(newadapters);
newadapters.startListening();
}
}
}
Код выше показывает, что String myStringFromActivity , полученный из MainActivity, будет нашим запросом для новых адаптеров.
Наконец, мы реализуем методы onPause и onResume для нашего фрагмента A
@Override
public void onPause() {
super.onPause();
Log.i(TAG, "onStop: adapter stopped");
if(myStringFromActivity== null){
adapter.stopListening();
} else {
newadapters.stopListening();
}
}
@Override
public void onResume() {
super.onResume();
if(myStringFromActivity==null){
setupRecyclers();
Log.e(TAG, "onResume: String null" );
}else{
menuItemRecyclers();
}
}
Приведенный выше код показывает, что если мы String myStringFromActivity равны нулю (пользователь не нажал ни на один элемент в нашей Topbaractivity, то он запускает Recycle'ы по умолчанию. В противном случае, если пользователь выбрал элемент, он запускает menuItemRecyclers (в зависимости от того, что вы сер выбирает).
Я все еще открыт для лучшей реализации в отношении этого. Надеюсь, это поможет!