RecyclerView 不在 Fragment 中显示项目,但在 Activity 中有效

问题描述

免责声明:在浏览了整个 StackOverflow 之后,我还没有找到解决方案。
我之前在另一个 Activity 中成功使用了 RecyclerView,因此我将该代码移植到 Fragment 中。我不确定为什么这些项目没有显示在 RecyclerView 中。经过调试,似乎 Fragment_Upcoming_Activities 类没有调用 ActivitiesAdapter 方法,例如 onBindViewHolder() 和 onCreateViewHolder()。

Fragment_Upcoming_Activities.java:

    private FirebaseAuth fAuth;
    private FirebaseFirestore fStore;
    private FirebaseUser mFirebaseUser;
    private RecyclerView mFirestoreList;
    private String currentUid;
    private CollectionReference catRef;
    private List<String> list_category = new ArrayList();
    private ArrayAdapter<String> adapter_category;
    private Spinner spCategories;
    private ActivitiesAdapter adapter;
    private View view;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,@NonNull ViewGroup container,@NonNull Bundle savedInstanceState) {
        fAuth = FirebaseAuth.getInstance();
        mFirebaseUser = fAuth.getCurrentUser();
        fStore = FirebaseFirestore.getInstance();
        currentUid = mFirebaseUser.getUid();
        return inflater.inflate(R.layout.fragment_upcoming_activity,container,false);
    }

    @Override
    public void onViewCreated(View view,@Nullable Bundle savedInstanceState) {
        super.onViewCreated(view,savedInstanceState);

        spCategories = view.findViewById(R.id.category_spinner);
        mFirestoreList = view.findViewById(R.id.upcoming_act_recycleView);
        //setUpCategoriesspinner();
        setupRecyclerView();
    }




    public void setUpCategoriesspinner(){

        //Department spinner population
        catRef = fStore.collection("parent_categories");
        list_category = new ArrayList<>();
        adapter_category = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_item,list_category);
        adapter_category.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spCategories.setAdapter(adapter_category);
        spCategories.setonItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent,View view,int position,long id) {
                String selected = (String) parent.getSelectedItem();
                displayUserData(selected);
            }

            @Override
            public void onnothingSelected(AdapterView<?> parent) {

            }
        });

        catRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        String categoryName = document.getString("category_name");
                        list_category.add(categoryName);
                    }
                    adapter_category.notifyDataSetChanged();
                }
            }
        });


    }

    public void displayUserData(String selected){
        System.out.println("Selected category: "  + selected);
        Query query;

        if (selected.equals("All Categories")) {
            System.out.println("ALL");
            query = fStore.collection("activities").whereEqualTo("act_purpose","All");
        } else {
            System.out.println("OTHER");
            String sub = selected.substring(selected.length() - 1);
            System.out.println(sub);
            int catNo = Integer.parseInt(sub);
            query = fStore.collection("activities").whereEqualTo("act_purpose","All").whereGreaterThan("act_category_number",sub).whereLessthan("act_category_number",sub).orderBy("act_category_number",Query.Direction.DESCENDING).orderBy("start_date",Query.Direction.DESCENDING);
        }

        //RecyclerOptions
        FirestoreRecyclerOptions<ActivitiesModel> options = new FirestoreRecyclerOptions.Builder<ActivitiesModel>()
                .setQuery(query,ActivitiesModel.class)
                .build();

        //View Holder
        adapter.updateOptions(options);
    }



    private void setupRecyclerView(){

        Query query = fStore.collection("activities");

        //RecyclerOptions
        FirestoreRecyclerOptions<ActivitiesModel> options = new FirestoreRecyclerOptions.Builder<ActivitiesModel>()
                .setQuery(query,ActivitiesModel.class)
                .build();

        //View Holder
        adapter = new ActivitiesAdapter(options);

        mFirestoreList.setLayoutManager(new linearlayoutmanager(getContext()));
        mFirestoreList.setAdapter(adapter);

        adapter.setonItemClickListener(new ActivitiesAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(DocumentSnapshot documentSnapshot,int position) {

            }
        });
    }

ActivityAdapter.java:


    private ActivitiesAdapter.OnItemClickListener listener;

    public ActivitiesAdapter(@NonNull FirestoreRecyclerOptions<ActivitiesModel> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull ActivitiesAdapter.ActivitiesHolder holder,@NonNull ActivitiesModel model) {

        String temp = model.getStart_date().toString().trim();
        String[] temparray = temp.split(" ");
        String startMonth = temparray[1];
        String startDate = temparray[2];
        String startYear = temparray[5];
        String act_title = model.getAct_title();
        String act_catName = model.getAct_category_name();
        String pdHoursAndPoints = model.getPoints()  + " Points  · " + model.getHours() + " Hours";

        holder.actTitle.setText(act_title);
        holder.startDate.setText(startDate + "\n" + startMonth + "\n" + startYear);
        holder.actCategory.setText(act_catName);
        holder.actPointsAndHours.setText(pdHoursAndPoints);

    }

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

    class ActivitiesHolder extends RecyclerView.ViewHolder {
        private TextView startDate,actTitle,actCategory,actPointsAndHours;

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

            startDate = itemView.findViewById(R.id.textview_startdate);
            actTitle = itemView.findViewById(R.id.textview_act_title);
            actCategory = itemView.findViewById(R.id.textview_act_category);
            actPointsAndHours = itemView.findViewById(R.id.textview_pointsandhours_act);

            itemView.setonClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION && listener != null){
                        listener.onItemClick(getSnapshots().getSnapshot(position),position);
                        //insert intent for edit here
                    }
                }
            });
        }
    }


    public interface OnItemClickListener{
        void onItemClick(DocumentSnapshot documentSnapshot,int position);
    }

    public void  setonItemClickListener(ActivitiesAdapter.OnItemClickListener listener){
        this.listener = listener;

    }

解决方法

我太笨了,我忘了添加 onStart() 和 onStop() 方法。希望这可以帮助任何有同样问题的人。

@Override
   public void onStart() {
       super.onStart();
       if(adapter != null){
           adapter.startListening();
       }
   }

@Override
  public void onStop() {
     super.onStop();
     if(adapter != null){
        adapter.stopListening();
     }
  }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...