简体   繁体   中英

How to put a RecyclerView into a Fragment?

I am still new for the android development. Currently, I am trying to show a RecyclerView within a Fragment. I tried to show the RecyclerView without using Fragment and it worked fine. But when it come to using Fragment, nothing is shown.

截图

Here is the MainActivity containing the Fragment:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //ButterKnife.bind(this);
        BottomNavigationView navView = findViewById(R.id.nav_view);

        navView.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);

        mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);

        mFragmentManager = getSupportFragmentManager();
        mFragmentTransaction = mFragmentManager.beginTransaction();
        mFragmentTransaction.add(R.id.fragment_container, missionListFragment).addToBackStack(null).commit();
    }

And the Fragment's onCreateView method:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View rootView = inflater.inflate(R.layout.fragment_mission_list, container, false);
        //ButterKnife.bind(rootview);
        mRecycler = (RecyclerView) rootView.findViewById(R.id.recycler);

        mFirestore = FirebaseFirestore.getInstance();
        mQuery = mFirestore.collection("COLLECTION_NAME").limit(LIMIT);

        if (mQuery == null) {
            Log.w(TAG, "No query, not initializing RecyclerView. Created data on server.");
        }

        mAdapter = new RecyclerViewAdapter(mQuery, this) {

            @Override
            protected void onDataChanged() {

            }

            @Override
            protected void onError(FirebaseFirestoreException e) {
                // Show a snackbar on errors
                Snackbar.make(getActivity().findViewById(android.R.id.content),
                        "Error: check logs for info.", Snackbar.LENGTH_LONG).show();
            }
        };
        mRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecycler.setAdapter(mAdapter);

        return rootView;
    }

With the RecyclerViewAdapter :

public class RecyclerViewAdapter extends FirestoreAdapter<RecyclerViewAdapter.ViewHolder> {

    private static final int UNAVAILABLE = 0, AVAILABLE = 1;

    public interface OnItemSelectedListener {

        void onItemSelected(DocumentSnapshot item);

    }

    private OnItemSelectedListener mListener;

    public RecyclerViewAdapter(Query query, OnItemSelectedListener listener) {
        super(query);
        mListener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        return new ViewHolder(inflater.inflate(R.layout.item, parent, false));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(getSnapshot(position), mListener);
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.view1)
        TextView view1;

        @BindView(R.id.view2)
        TextView view2;

        @BindView(R.id.view3)
        TextView view3;

        @BindView(R.id.view4)
        TextView view4;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

        public void bind(final DocumentSnapshot snapshot,
                         final OnItemSelectedListener listener) {

            Item item = snapshot.toObject(Item.class);
            Resources resources = itemView.getResources();

            view1.setText(item.getfield1());
            view2.setText(Integer.toString(item.getfield2()));
            if(item.getfield3() == AVAILABLE)
                view3.setText("Available");
            else
                view3.setText("Unavailable");
            view4.setText(item.getfield4().toString());

            // Click listener
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (listener != null) {
                        listener.onItemSelected(snapshot);
                    }
                }
            });
        }

    }
}

As you can notice above, I am getting data from the Firebase and displaying them as a RecyclerView. But I don't think it is the problem of empty query data, so please help.

It could be that data from firebase is not being retrieved, hence there is no content for recyclerview to display. Please check if your firebase connection is working fine and you are retrieving something from it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM