首页 > 解决方案 > 没有数据返回时如何清除我的 Firebase ListView?

问题描述

我有一个 ListView,它通过从日期结构化的 Firebase 数据库中检索数据来显示事件。我的 XML 只是一个 ListView,上面有 2 个按钮来切换日期。现在,当我在 12 月 6 日和 12 月 8 日之间切换时,ListView 会适当地更新自身。但是,当我转到 12 月 9 日、12 月 10 日等时,ListView 仍然显示 12 月 8 日的数据。每次更改日期时我都清除了数组,所以我不知道为什么会发生这种情况。

这是我的 Firebase 数据库的示例:

Timetable
   Ladybridge High School, Bolton, UK
      Date
         2019-12-06
            Events
               Event 1
                  Detail 1
                  Detail 2
                  etc.
         2019-12-07
            Events
               Event 2
                  Detail 1
                  Detail 2
                  etc.
               Event 3
                  Detail 1
                  Detail 2
                  etc.
         2019-12-08
            Events
               Event 4
                  Detail 1
                  Detail 2
                  etc.
         2019-12-09
            Events
               [NO DATA]

我已经删除了不相关的部分,所以这是我的主要活动的 java 代码:

public class Profile extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.school_profile);

        final ListAdapter eventsAdapter = new EventsAdapter(this, titleArray, eventStartArray, eventFinishArray, eventGenderArray, eventAgeArray, descriptionArray);
        eventsListView.setAdapter(eventsAdapter);

        Intent intent = getIntent();
        final String clickedName = intent.getStringExtra("clickedName");

        final Calendar c = Calendar.getInstance();
        df = new SimpleDateFormat("yyyy-MM-dd");
        formattedDate = df.format(c.getTime());
        textViewDate.setText(formattedDate);

        View.OnClickListener previousListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                c.add(Calendar.DATE, -1);
                formattedDate = df.format(c.getTime());
                textViewDate.setText(formattedDate);

                clearArray();
                eventsQuery(clickedName, eventsAdapter);
            }
        };
        buttonPrevious.setOnClickListener(previousListener);

        View.OnClickListener nextListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                c.add(Calendar.DATE, +1);
                formattedDate = df.format(c.getTime());
                textViewDate.setText(formattedDate);

                clearArray();
                eventsQuery(clickedName, eventsAdapter);
            }
        };
        buttonNext.setOnClickListener(nextListener);

        eventsQuery(clickedName, eventsAdapter);
    }

    public void eventsQuery(final String clickedName, final Adapter eventsAdapter) {
        dawnEvents = FirebaseDatabase.getInstance().getReference("Timetable/" + clickedName + "/Date/" + textViewDate.getText().toString() + "/Events");
        dawnEvents.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                String titleValue = dataSnapshot.child("Title").getValue().toString();
                titleArray.add(titleValue);

                String eventStartValue = dataSnapshot.child("Start").getValue().toString();
                eventStartArray.add(eventStartValue);

                String eventFinishValue = dataSnapshot.child("Finish").getValue().toString();
                eventFinishArray.add(eventFinishValue);

                String eventGenderValue = dataSnapshot.child("Gender").getValue().toString();
                eventGenderArray.add(eventGenderValue);

                String eventAgeValue = dataSnapshot.child("Age").getValue().toString();
                eventAgeArray.add(eventAgeValue);

                String descriptionValue = dataSnapshot.child("Description").getValue().toString();
                descriptionArray.add(descriptionValue);

                ((BaseAdapter)eventsAdapter).notifyDataSetChanged();

            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    public void clearArray() {
        titleArray.clear();
        eventStartArray.clear();
        eventFinishArray.clear();
        eventGenderArray.clear();
        eventAgeArray.clear();
        descriptionArray.clear();
    }

}

这是我的适配器代码:

public class EventsAdapter extends ArrayAdapter<String> {

    private final Activity context;
    private final ArrayList<String> titleArray;
    private final ArrayList<String> eventStartArray;
    private final ArrayList<String> eventFinishArray;
    private final ArrayList<String> eventGenderArray;
    private final ArrayList<String> eventAgeArray;
    private final ArrayList<String> descriptionArray;

    public EventsAdapter(Activity context, ArrayList<String> titleArray, ArrayList<String> eventStartArray, ArrayList<String> eventFinishArray, ArrayList<String> eventGenderArray, ArrayList<String> eventAgeArray, ArrayList<String> descriptionArray) {
        super(context, R.layout.events_list_view, titleArray);

        this.context = context;
        this.titleArray = titleArray;
        this.eventStartArray = eventStartArray;
        this.eventFinishArray = eventFinishArray;
        this.eventGenderArray = eventGenderArray;
        this.eventAgeArray = eventAgeArray;
        this.descriptionArray = descriptionArray;
    }

    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.events_list_view, null, true);

        TextView eventTitle = rowView.findViewById(R.id.eventTitle);
        TextView eventDetails = rowView.findViewById(R.id.eventDetails);
        TextView eventDescription = rowView.findViewById(R.id.eventDescription);

        eventTitle.setText(titleArray.get(position));
        String eventDetailsConcat = eventStartArray.get(position) + " - " + eventFinishArray.get(position) + ", " + eventGenderArray.get(position) + ", " + eventAgeArray.get(position);
        eventDetails.setText(eventDetailsConcat);
        eventDescription.setText(descriptionArray.get(position));

        return rowView;
    }
}

标签: androidfirebaselistviewfirebase-realtime-database

解决方案


这是通过清除携带数据的数组来实现的。示例:titleArray.clear();


推荐阅读