基于Firebase getRef()

时间:2017-05-11 09:15:19

标签: android android-fragments firebase firebase-realtime-database

我有一个列表视图,可以生成爱丁堡的俱乐部列表,包括图像,标题和特殊优惠。当用户点击俱乐部时,他们希望看到更多关于新片段打开的信息,并且有关该俱乐部的数据。我能够使用getRef()获取正确的子名称并将其输出为toast,问题是如何使用当用户单击列表时我的textViews会自动填充相应的数据?

这是我的ClubList片段

public class ClubListFragment extends Fragment {

    private RecyclerView clubList;

    private DatabaseReference mDatabase;

    public ClubListFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_club_list, container, false);


        mDatabase = FirebaseDatabase.getInstance().getReference().child("clubs");

        mDatabase.keepSynced(true);


        //declare and populate the clublist view
        clubList = (RecyclerView) rootView.findViewById(R.id.lstClub_List);
        clubList.setHasFixedSize(true);
        clubList.setLayoutManager(new LinearLayoutManager(getActivity()));

        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();

        FirebaseRecyclerAdapter<Clubs, ClubListHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Clubs, ClubListHolder>(

            Clubs.class,
            R.layout.club_row,
            ClubListHolder.class,
            mDatabase


        ) 
        {
            @Override
            protected void populateViewHolder(ClubListHolder viewHolder, Clubs model, int position) {

                final String post_key = getRef(position).getKey();

                viewHolder.setTitle(model.getTitle());
                viewHolder.setOpen(model.getOpen());
                viewHolder.setDesc1("*" + model.getDesc1());
                viewHolder.setDesc2("*" + model.getDesc2());
                viewHolder.setDesc3("*" + model.getDesc3());
                viewHolder.setImage(getActivity(), model.getImage());

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

                        Toast.makeText(getActivity(), post_key , Toast.LENGTH_SHORT).show();

                        ClubInfoFragment fragment = new ClubInfoFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction =
                                getActivity().getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.fragment_container, fragment);
                        fragmentTransaction.commit();
                    }
                });
            }
        };
        clubList.setAdapter(firebaseRecyclerAdapter);
    }

    public static class ClubListHolder extends RecyclerView.ViewHolder{

        View nView;

        public ClubListHolder(View itemView) {
            super(itemView);

            nView = itemView;
        }

        public void setTitle(String title) {

            TextView club_title = (TextView) nView.findViewById(R.id.txtTitle);
            club_title.setText(title);

        }

        public void setOpen(String open) {

            //finds day of the week and converts it to a string
            String day;
            SimpleDateFormat dayFormat = new SimpleDateFormat("EEEE", Locale.UK);

            Calendar calendar = Calendar.getInstance();
            day = dayFormat.format(calendar.getTime());

            //find the Open/Closed Today TextView
            TextView club_open = (TextView) nView.findViewById(R.id.txtOpen);

            //parses the database for a day that macthes the current day, if found then...
            if (open.contains(day)){
                club_open.setText("Open Today");
                ((TextView) nView.findViewById(R.id.txtOpen)).setTextColor(Color.GREEN);
            }

            //else do this
            else
            {
                club_open.setText("Closed Today");
                ((TextView) nView.findViewById(R.id.txtOpen)).setTextColor(Color.RED);
            }
        }

        public void setDesc1(String desc1) {

            TextView club_desc1 = (TextView) nView.findViewById(R.id.txtDesc1);
            club_desc1.setText(desc1);

        }

        public void setDesc2(String desc2) {

            TextView club_desc2 = (TextView) nView.findViewById(R.id.txtDesc2);
            club_desc2.setText(desc2);

        }

        public void setDesc3(String desc3) {

            TextView club_desc3 = (TextView) nView.findViewById(R.id.txtDesc3);
            club_desc3.setText(desc3);

        }

        public void setImage(Context ctx, String image) {

            ImageView club_image = (ImageView) nView.findViewById(R.id.imgClub);
            Picasso.with(ctx).load(image).into(club_image);
        }
    }

}

我应该以某种方式保存Firebase引用并使其成为一个全局变量,然后在新的片段中使用,或者有没有办法从我的ClubListFragment中执行它?

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您可以使用参数将其传递给ClubInfoFragment:

Bundle clubObjBundle=new Bundle();
clubObjBundle.putSerializable("mymodel",model);
ClubInfoFragment fragment = new ClubInfoFragment();
fragment.setArguments(clubObjBundle);
FragmentTransaction ft=getActivity().getSupportFragmentManager().beginTransaction();
                    ft.replace(R.id.fragment_container, fragment);
                    ft.commit();

ClubInfoFragment's oncreate方法中,您可以获取所有详细信息,而无需再拨打另一个firebase。

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
if(getArguments!=null){
    Bundle bundle=getArguments();
    Clubs model=(Clubs)bundle.getSerializable("mymodel");
 }


  /*call and use your setTitle,setDesc1 etc on model object */


}

还要确保您的Clubs班级实施Serializable

public class Clubs implements Serializable {`

 /*keep content as it is*/

}