android - 没有数据返回时如何清除我的 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;
}
}
解决方案
这是通过清除携带数据的数组来实现的。示例:titleArray.clear();
推荐阅读
- python - 使用 statsmodels 进行简单回归 - fit() 错误
- c# - 处理 LINQ 查询中的异常
- git - Git 无法克隆 repo
- freeswitch - 在 docker hub 中找不到 Freeswitch-rayo
- android - 无法解析 org.kodein.di:kodein-di-framework-android
- symfony - Fos elastica 过滤器结果与数组“记录 id”
- c# - 如何修复 WPF 中的导航/帧错误?错误 #CS1061
- oracle - 将参数值返回到 VBScript
- xamarin - Xamarin.Mac 在使用 NSSavePanel 时显示默认文件名
- java - 使用 DnD 骰子滚轮的循环将变量添加到数组