簡體   English   中英

將數據從一個片段傳遞到另一個片段,從 FirebaseRecyclerAdapter

[英]Passing data from one fragment to another fragment from FirebaseRecyclerAdapter

我是新來的。 我知道有很多關於此的問題,但我無法解決這個問題。 我想通過 firebaserecycleradapter 將數據從一個片段傳遞到另一個片段

這是我的第一個片段

private  FirebaseDatabase database;
private  DatabaseReference mReference;
private  RecyclerView recyclerView_food;
private  RecyclerView.LayoutManager layoutManager;
private  LinearLayout nonVegBtn;
private  HomeItem adapterHome;
private ProgressDialog progressDialog;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_menu_home, container, false);
        progressDialog.setMessage("Loading...");
        database=FirebaseDatabase.getInstance();
        recyclerView_food=(RecyclerView) view.findViewById(R.id.homeFoodRecycleView);
        recyclerView_food.setLayoutManager(new LinearLayoutManager(getContext()));
        Query query = mReference = FirebaseDatabase.getInstance().getReference("Categoria");
        FirebaseRecyclerOptions<Categoria> options = new FirebaseRecyclerOptions.Builder<Categoria>().
                setQuery(query,Categoria.class).build();
        adapterHome = new HomeItem(options);
        recyclerView_food.setAdapter(adapterHome);
        return view;
    }
    @Override
    public void onStart() {
        super.onStart();
        adapterHome.startListening();
    }
    @Override
    public void onStop() {
        super.onStop();
        adapterHome.stopListening();
    }
}

這是我想將數據從中傳遞到第二個片段的 FirebaseRecyclerAdapter,我使用了 Bundle 方法,但它不起作用

public class HomeItem extends FirebaseRecyclerAdapter<Categoria,HomeItem.viewHolder>{

    public HomeItem(@NonNull FirebaseRecyclerOptions<Categoria> options) {
        super(options);
    }


    @Override
    protected void onBindViewHolder(@NonNull viewHolder holder, int position, @NonNull Categoria model) {

        String getID=getRef(position).getKey();


        holder.texFood.setText(model.getName());
        Glide.with(holder.imageFood.getContext()).load(model.getImage()).placeholder(R.drawable.non_veg).into(holder.imageFood);
        holder.itemButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Bundle bundle = new Bundle();
                bundle.putString("categoryID",getID);
                AllFoodItem newsFragment = new AllFoodItem();
                newsFragment.setArguments(bundle);

               AppCompatActivity appCompatActivity =(AppCompatActivity)holder.itemButton.getContext();
               appCompatActivity.getSupportFragmentManager().beginTransaction().replace(R.id.frameItemLeyaut,
                       new AllFoodItem()).addToBackStack(null).commit();

            }
        });

    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.home_item,parent,false);
        return new viewHolder(v);
    }

    public class viewHolder extends RecyclerView.ViewHolder{
        public TextView texFood;
        public ImageView imageFood;
        public LinearLayout itemButton;

        public viewHolder(@NonNull View itemView) {
            super(itemView);

            texFood=itemView.findViewById(R.id.nonVegtxt);
            imageFood=itemView.findViewById(R.id.foodIMG);
            itemButton=itemView.findViewById(R.id.nonVegBtn);
        }
    }

}

這是我想要獲取數據的第二個片段。 請幫助我使用什么方法

public class AllFoodItem extends Fragment {

    RecyclerView mRecyclerView;
    FirebaseDatabase database;
    DatabaseReference mReference;
    private FoodViewHolder adapterFood;
    String getIdFood ="";


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

        database=FirebaseDatabase.getInstance();
        mReference = FirebaseDatabase.getInstance().getReference("food");

        mRecyclerView=view.findViewById(R.id.nonVegRecyclerView);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(),2,GridLayoutManager.VERTICAL,false);
        mRecyclerView.setLayoutManager(gridLayoutManager);
        Bundle bundle = this.getArguments();
        if (bundle!=null){
            getIdFood=bundle.getString("categoryID");
        }

        Query query = mReference = FirebaseDatabase.getInstance().getReference("food");
        FirebaseRecyclerOptions<Food> options = new FirebaseRecyclerOptions.Builder<Food>().
                setQuery(query.orderByChild("MenuId").equalTo(getIdFood),Food.class).build();
        adapterFood = new FoodViewHolder(options);
        mRecyclerView.setAdapter(adapterFood);

        return view;
    }

    @Override
    public void onStop() {
        super.onStop();
        adapterFood.stopListening();
    }
    @Override
    public void onStart() {
        super.onStart();
        adapterFood.startListening();
    }
}

當您啟動新片段時,您會創建它的一個實例 ( newsFragment ) 並在此處設置它的 arguments

Bundle bundle = new Bundle();
bundle.putString("categoryID",getID);
AllFoodItem newsFragment = new AllFoodItem();
newsFragment.setArguments(bundle);

然后當你 go 開始片段時,你完全忽略了你剛剛創建的片段實例,並在此處創建一個新實例(沒有捆綁包 arguments 集)

appCompatActivity.
    getSupportFragmentManager().
    beginTransaction().
    replace(R.id.frameItemLeyaut, new AllFoodItem()). // <- here
    addToBackStack(null).
    commit();

而不是在那里調用new AllFoodItem()你應該傳入你已經創建的片段實例並將 arguments 設置為 on,就像這樣

appCompatActivity.
    getSupportFragmentManager().
    beginTransaction().
    replace(R.id.frameItemLeyaut, newsFragment). // <- here
    addToBackStack(null).
    commit();

暫無
暫無

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

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