【问题标题】:FirestoreUI populate RecyclerView on clickFirestoreUI 在点击时填充 RecyclerView
【发布时间】:2020-10-24 16:00:06
【问题描述】:

问题: 我在顶部有一个水平滚动日历,下面有一个回收器视图,显示该日期的事件。我想默认显示当前日期的事件,如果我点击另一天,它将显示当天的事件。

例如。默认情况下,如果今天是 7 月 4 日,日历将选择在 7 月 4 日,它只会显示 7 月 4 日的事件,然后如果我在日历上单击/按 7 月 5 日,则 7 月 4 日的事件应该消失,而7 月 5 日应该会出现在 RecyclerView 中。

我的尝试:

    private RecyclerView mFirestoreList;
    private FirebaseFirestore firebaseFirestore;
    private FirestoreRecyclerAdapter adapter;
    private String day = Integer.toString(Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
    private String month = Integer.toString(Calendar.getInstance().get(Calendar.MARCH));
    private String year =  Integer.toString(Calendar.getInstance().get(Calendar.YEAR));

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

        createEvent = (Button) v.findViewById(R.id.createEventBtn2);
        logout = (Button) v.findViewById(R.id.logoutBtn2);

        HorizontalPicker picker = (HorizontalPicker) v.findViewById(R.id.datePicker);
        picker.setListener(this).setDays(120).setOffset(7).setDateSelectedColor(Color.DKGRAY)
                .setDateSelectedTextColor(Color.WHITE)
                .setMonthAndYearTextColor(Color.DKGRAY)
                .setTodayButtonTextColor(getResources().getColor(R.color.colorPrimary))
                .setTodayDateTextColor(getResources().getColor(R.color.colorPrimary))
                .setTodayDateBackgroundColor(Color.GRAY)
                .setUnselectedDayTextColor(Color.DKGRAY)
                .setDayOfWeekTextColor(Color.DKGRAY)
                .setUnselectedDayTextColor(getResources().getColor(R.color.primaryTextColor))
                .showTodayButton(false).init();
        picker.setBackgroundColor(Color.LTGRAY);
        picker.setDate(new DateTime());

        firebaseFirestore = FirebaseFirestore.getInstance();
        mFirestoreList = v.findViewById(R.id.firestore_list);

        //Query
        Query query = firebaseFirestore.collection(year).document(month).collection(day);
        //Recycler options
        FirestoreRecyclerOptions<EventModel> options = new FirestoreRecyclerOptions.Builder<EventModel>()
                .setQuery(query, EventModel.class)
                .build();

        adapter = new FirestoreRecyclerAdapter<EventModel, EventsViewHolder>(options) {

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

            @Override
            protected void onBindViewHolder(@NonNull EventsViewHolder holder, int position, @NonNull EventModel model) {
                holder.className.setText(model.getClassName());
                holder.location.setText(model.getLocation());
                holder.time.setText(model.getTime());
            }
        };

        mFirestoreList.setHasFixedSize(true);
        mFirestoreList.setLayoutManager(new LinearLayoutManager(getContext()));
        mFirestoreList.setAdapter(adapter);


      createEvent.setOnClickListener(new View.OnClickListener() {
          @Override
        public void onClick(View v) {
            openCreatePage();
        }
       });

        logout.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                startActivity(new Intent(v.getContext(), Register.class));
            }
        });
        return v;
    }
    @Override
    public void onDateSelected(DateTime dateSelected){
        Toast.makeText(v.getContext(), dateSelected.toString(), Toast.LENGTH_SHORT).show();
        day = Integer.toString(dateSelected.getDayOfMonth());
        month = Integer.toString(dateSelected.getMonthOfYear());
        year = Integer.toString(dateSelected.getYear());
    }

    private class EventsViewHolder extends RecyclerView.ViewHolder{

        private TextView className;
        private TextView location;
        private TextView time;
        public EventsViewHolder(@NonNull View itemView) {
            super(itemView);

            className = itemView.findViewById(R.id.classNameSLI);
            location = itemView.findViewById(R.id.locationSLI);
            time = itemView.findViewById(R.id.timeSLI);

        }
    }

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

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

我试图做的是更改日、月和年变量,由于这些变量正在更改,因此查询会更改,但不会更改。

这可能吗?我在找什么但找不到?

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    一旦创建了适配器,就无法更改对 FirebaseRecyclerAdapter 的查询。你可以阅读更多关于为什么in this answer

    您可以做的是将适配器的创建和设置放在您提供日、月和年的方法中,如下所示:

    private void createAndSetAdapter(String day, String month, String year) {
    
        //Query
        Query query = firebaseFirestore.collection(year).document(month).collection(day);
        //Recycler options
        FirestoreRecyclerOptions < EventModel > options = new FirestoreRecyclerOptions.Builder < EventModel > ()
            .setQuery(query, EventModel.class)
            .build();
    
        adapter = new FirestoreRecyclerAdapter < EventModel, EventsViewHolder > (options) {
    
            @NonNull
            @Override
            public EventsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_list_item, parent, false);
                return new EventsViewHolder(view);
            }
    
            @Override
            protected void onBindViewHolder(@NonNull EventsViewHolder holder, int position, @NonNull EventModel model) {
                holder.className.setText(model.getClassName());
                holder.location.setText(model.getLocation());
                holder.time.setText(model.getTime());
            }
        };
    
        // Leave these two lines out of this method, and keep it inside your onCreate
        // mFirestoreList.setHasFixedSize(true);
        // mFirestoreList.setLayoutManager(new LinearLayoutManager(getContext()));
    
        mFirestoreList.setAdapter(adapter);
    }
    

    然后在你的 onDateSelected() 方法中调用这个方法:

    @Override
    public void onDateSelected(DateTime dateSelected) {
        Toast.makeText(v.getContext(), dateSelected.toString(), Toast.LENGTH_SHORT).show();
        day = Integer.toString(dateSelected.getDayOfMonth());
        month = Integer.toString(dateSelected.getMonthOfYear());
        year = Integer.toString(dateSelected.getYear());
        createAndSetAdapter(day, month, year)
    }
    

    不要忘记在你的 onCreate 中使用这个方法!

    【讨论】:

    • 此解决方案部分有效。我现在遇到的问题是,如果我为 7 月 4 日创建一个新活动,那么 7 月 4 日的所有活动都会出现。但是,如果我在 7 月 5 日单击/按下并返回到 7 月 4 日,事件就会消失。最后,只需单击另一个日期,它不会填充 RecyclerView。如果我在 7 月 5 日单击/按下,则不会显示 7 月 5 日的事件。是不是适配器有问题?
    • 我注意到您从未调用过您的方法onDateSelected。当您从选择器中选择日期时,应该调用它。
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多