Изменить содержимое RecyclerView после нажатия на элемент в меню DropDown - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть два контейнера в моей домашней деятельности, один - Контейнер фрагмента верхней панели , а другой - Контейнер ViewPagers . Контейнер фрагментов верхней панели состоит только из одного фрагмента, который является фрагментом верхней панели (позволяет пользователю выбирать тег), в то время как Viewpager состоит из 2 фрагментов, которые в каждом из фрагментов имеют представление переработчика для отображения сообщений с выбранные теги на фрагменте верхней панели.

Я пытаюсь добиться того, чтобы при нажатии элемента на фрагменте верхней панели он получал значение для текста, а затем отправлял его в операцию с использованием интерфейса, а затем Диспетчеры фрагментов получат это значение из действия и зададут запрос firebase в соответствии с переданным текстом.

До сих пор фрагменты выполняли отправку данных друг другу с использованием интерфейсов. Однако адаптеры прослушивают только один раз, когда создается представление, а не когда данные передаются из фрагментов. Как обновить адаптеры после отправки данных из фрагмента верхней панели?

Вот мой ViewPagerFragment (RecyclerView):

    FirebaseRecyclerOptions options, options2;
    FirebaseRecyclerAdapter<Question, QuestionsViewHolder> adapter;

     <!---- oncreate Code---->

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        String ChosenTag = tvtest.getText().toString();

        if (text.equals("")){
            Query query = questionReference.orderByChild("location").equalTo("jakarta");


            options = new FirebaseRecyclerOptions.Builder<Question>()
                            .setQuery(query, Question.class)
                            .build();

            adapter = new FirebaseRecyclerAdapter<Question, QuestionsViewHolder>(options) {

                @Override
                protected void onBindViewHolder(@NonNull QuestionsViewHolder 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_card_question_new, viewGroup, false);
                    QuestionsViewHolder viewHolder = new QuestionsViewHolder(view);
                    return viewHolder;
                }
            };

            qListRv.setAdapter(adapter);
            adapter.startListening();
        } else {

            Query query = questionReference.orderByChild("tags").equalTo(ChosenTag);

            options2 = new FirebaseRecyclerOptions.Builder<Question>()
                    .setQuery(query, Question.class)
                    .build();
            adapter.updateOptions(options2);
        }
    }

Проще говоря, если пользователь не выбрал в TopBarFragment затем возвращает нулевое значение, адаптер запрашивает текущее местоположение пользователя. Иначе, если пользователь выбрал тег во фрагменте верхней панели, фрагмент верхней панели затем отправляет тег в строку, обновляет String ChosenTag, а затем адаптер обновляет свои параметры до options2 , что запросы по выбранному тегу.

Я не могу обновить sh моего реселлера после выбора. Все же интерфейсы работают отлично. Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 14 апреля 2020

Я искал везде, и, кажется, никто не мог мне помочь, вот что я сделал, и это сработало для меня. Надеюсь, это поможет.

Я изменил фрагмент B (TopBarFragment) на активность (TopBarActivity)

Причина, по которой я изменил фрагмент на активность, заключается в том, что я хотел целые Адаптеры RecyclerView для остановки прослушивания, когда пользователь направляется на активность TopBar. Таким образом, я могу инициировать новый адаптер по возвращении в Activity, которая содержит RecyclerViews.

План

  1. Создайте два набора адаптеров (один для defaultAdapter другое для того, что пользователь нажимает на TopBarActivity. давайте назовем его menuItemAdapter).
  2. Дополнительные функции для отправки строк из TopBarActivity при щелчках пользователя в MainActivity. Затем фрагменты будут проверять строки MainActivity.
  3. Создать два метода переопределения (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 (в зависимости от того, что вы сер выбирает).

Я все еще открыт для лучшей реализации в отношении этого. Надеюсь, это поможет!

...