java - 单击下拉菜单中的项目后更改 RecyclerView 内容

标签 java firebase android-fragments firebase-realtime-database android-recyclerview

我的家庭 Activity 中有两个容器,一个是 Top Bar Fragment Container,另一个是 ViewPagers Container顶栏片段容器仅由一个片段组成,即顶栏片段(允许用户选择一个标签),而 Viewpagers 由 2 个片段组成,每个片段都有一个回收器 View 来显示帖子与顶部栏片段上选定的标签一起。

我想要实现的是,当单击顶部栏片段上的某个项目时,它会获取文本值,然后使用界面将其发送到 Activity ,稍后片段 View 页面将从 Activity 获取该值并设置根据传递的文本进行 firebase 查询。

到目前为止,片段可以很好地使用接口(interface)相互发送数据。但是,适配器仅在创建 View 时监听一次,而不是在从片段传递数据时监听一次。从顶部栏片段发送数据后如何更新适配器?

这是我的 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 上进行选择,则文本将返回 null,适配器将查询用户的当前位置。否则,如果用户在顶部栏片段上选择了一个标签,则顶部栏片段会将标签发送到字符串,更新 String ChosenTag,然后适配器会将其选项更新为 options2 ,它查询所选标签。

选择后我无法刷新我的回收 View 。但接口(interface)工作正常。有什么办法可以实现这一点吗?

最佳答案

我到处搜索过,似乎没有人能帮助我,所以这就是我所做的,这对我有用。希望这会有所帮助。

我将片段 B (TopBarFragment) 更改为 Activity (TopBarActivity)

我将片段更改为 Activity 的原因是因为我希望每当用户定向到 TopBar Activity 时整个 RecyclerView 适配器就停止监听。这样我就可以在返回保存 RecyclerViews 的 Activity 时启动一个新的适配器。

计划

  1. 制作两组适配器(一组用于defaultAdapter,另一组用于 用户在 TopBarActivity 上单击的内容。我们就这样调用它吧 菜单项适配器)。
  2. 在用户单击 MainActivity 时从 TopBarActivity 发送字符串的附加功能。从那时起,片段将检查字符串 主要 Activity 。
  3. 创建两个覆盖方法(onPause 和 onResume),以停止监听适配器或开始监听它们。我们将 在这里创建条件来监听默认适配器或 监听用户点击的内容。这些条件将检查是否 第 2 点上的字符串是否存在。如果存在那就听听 menuItemAdapter 否则如果字符串不存在,则监听 默认适配器。

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);
                        }
                 }

主要 Activity

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 中调用

将代码片段化

    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) {
        }
    });

}

然后将menuItem Recyclers添加到Fragment A

    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();
            }
        }
}

上面的代码显示,从 MainActivity 检索到的字符串 myStringFromActivity 将成为我们对新适配器的查询。

最后,我们为片段 A 实现 onPause 和 onResume 方法

    @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();
    }
}

上面的代码显示,如果我们的字符串myStringFromActivity为空(用户没有点击我们的Topbaractivity中的任何项目,那么它就会运行默认的回收站。否则,如果用户选择了一个项目,那么它就会运行运行menuItemRecyclers(基于用户选择)。

我仍然对这一问题的更好实现持开放态度。希望这有帮助!

关于java - 单击下拉菜单中的项目后更改 RecyclerView 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61168463/

相关文章:

java - Graphics2D.drawString 中的换行符问题

swift - 将 Firebase 中的坐标表示为 Swift 注释

swift - 访问不可用 此资源仅适用于注册开发人员计划的开发人员

android - 如何将 fragment 替换为 TabLayout 和 ViewPager 中的另一个 fragment

java - 如何使用空的soapAction定义调用Web服务?

java - @Path 轻松地使用变量?

android - 无法编译 'com.firebaseui:firebase-ui-database:2.1.1'

android - 如何为任务添加 fragment 范围的监听器?

android - 致命异常 : main java. lang.NoClassDefFoundError : android. support.v7.internal.widget.TintManager

java - 将参数传递给 @Inject Bean 的实例