单击 recyclerView 后从 firebase 获取数据

Fetch Data from firebase after clicking on a recyclerView

我有一个 recyclerview,其文本包含问题。我想要做的是当用户点击 关于问题,预期答案应显示在下一个视图的文本视图中。

这是我的数据库架构。

这是我家的片段。


import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.solver.widgets.Snapshot;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.firebase.ui.database.SnapshotParser;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;

import java.util.Objects;

public class HomeFragment extends Fragment {

    private RecyclerView recyclerView;
    FloatingActionButton addButton;
    DatabaseReference mDatabase;
    FirebaseRecyclerAdapter adapter;




    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View RootView = inflater.inflate(R.layout.fragment_home, container, false);
        addButton = RootView.findViewById(R.id.add);
        recyclerView = RootView.findViewById(R.id.my_recycler_view);

        mDatabase = FirebaseDatabase.getInstance().getReference("Question");
        mDatabase.keepSynced(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));

        Query query = FirebaseDatabase.getInstance().getReference().child("Question");

        FirebaseRecyclerOptions<Problem_Questions_RecyclerView> options = new FirebaseRecyclerOptions.Builder<Problem_Questions_RecyclerView>()
                .setQuery(query, new SnapshotParser<Problem_Questions_RecyclerView>() {
                    @NonNull
                    @Override
                    public Problem_Questions_RecyclerView parseSnapshot(@NonNull DataSnapshot snapshot) {

                        return new Problem_Questions_RecyclerView(Objects.requireNonNull(snapshot.child("ID").getValue()).toString(),
                                Objects.requireNonNull(snapshot.child("Question").getValue()).toString());
                    }
                }).build();
        adapter = new FirebaseRecyclerAdapter<Problem_Questions_RecyclerView, ViewHolder>(options){

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

            }

            @Override
            protected void onBindViewHolder(@NonNull ViewHolder viewHolder, int i, @NonNull Problem_Questions_RecyclerView details) {


                viewHolder.setQuestion(details.getQuestion());



                viewHolder.root.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        Objects.requireNonNull(getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                                new Answers()).addToBackStack(null).commit();

                    }
                });
            }
        };
        recyclerView.setAdapter(adapter);


        return RootView;
    }


    public class ViewHolder extends RecyclerView.ViewHolder{
        LinearLayout root;
        TextView Question;




        ViewHolder(@NonNull View itemView) {
            super(itemView);
            root = itemView.findViewById(R.id.list_root);
            Question = itemView.findViewById(R.id.txt);


        }

       void setQuestion(String string)
       {
           Question.setText(string);
       }


    }



    @Override
    public void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}



import android.app.DownloadManager;

public class Problem_Questions_RecyclerView {
    public Problem_Questions_RecyclerView(){

    }

    public void setUID(String UID) {
        this.UID = UID;
    }

    public String getQuestion() {
        return Question;
    }

    public void setLocation(String question) {
        Question = question;
    }



    public Problem_Questions_RecyclerView(String UID, String question) {
        this.UID = UID;
        Question = question;

    }

    private String UID,Question;


}




这是我的答案 class,其中包含用于显示答案的文本视图。 我已经实现了一些东西,比如当我点击它时它应该显示问题本身而不是答案(测试目的),但我必须提供常量 ID 来获取数据。我应该怎么做才能获得点击的 recyclerview 的 ID 并在下一个片段中显示答案

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class Answers extends Fragment {
    DatabaseReference mDatabase;
    private TextView textView;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.answers, container, false);


        mDatabase = FirebaseDatabase.getInstance().getReference().child("Question").child("xxyy").child("Question");



        textView = view.findViewById(R.id.answer);

        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                String v = dataSnapshot.getValue().toString();
                textView.setText(v);


            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });





        return view;

    }


}

现在,当我点击具有

的回收站视图时
question 2

它应该打开另一个包含

的片段
this is answer 2


您需要执行以下操作。在您的模型 class 中,您应该添加另一个包含答案的字符串。当你将答案存储在你的模型 class 中时,在你的适配器方法 onBindViewHolder 中,在点击方法中,做你想做的,并在新的 activity 中传递你需要的值(你可以包裹所有模型 class,或者只传递您需要的值,您自己选择)。