Android ListView已填充,但每个视图最初都是空的?
我在片段中使用了一个ListView,它从Firebase存储中下载注释,然后显示它们。然而,我遇到的问题是,当它显示注释时,它只是一个空的注释布局,但是当我切换活动并返回时,它们不再是空的,它们被加载了。我不确定我到底出了什么问题,我尝试调用onDataSetChange到Adapter Everywhere,还尝试在ListView上使用invalidate和InvalidateView,希望它只是刷新视图,但不幸的是,这也不起作用:/下面是代码,高级感谢您的帮助!: 这就是我在Notes片段中设置适配器的地方Android ListView已填充,但每个视图最初都是空的?,android,firebase,firebase-realtime-database,android-arrayadapter,Android,Firebase,Firebase Realtime Database,Android Arrayadapter,我在片段中使用了一个ListView,它从Firebase存储中下载注释,然后显示它们。然而,我遇到的问题是,当它显示注释时,它只是一个空的注释布局,但是当我切换活动并返回时,它们不再是空的,它们被加载了。我不确定我到底出了什么问题,我尝试调用onDataSetChange到Adapter Everywhere,还尝试在ListView上使用invalidate和InvalidateView,希望它只是刷新视图,但不幸的是,这也不起作用:/下面是代码,高级感谢您的帮助!: 这就是我在Notes片
mNoteStorage = FirebaseStorage.getInstance().getReference().child("Notes").child(currentUser.getUid());
mNotesDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
my_notes.setAdapter(null);
Iterable<DataSnapshot> all_keys = dataSnapshot.getChildren();
filename_arrayList = new ArrayList<>();
na = null;
for (DataSnapshot each_key : all_keys) {
String each = each_key.getKey();
filename_arrayList.add(each);
}
for (String each_filename : filename_arrayList) {
downloadFile(each_filename);
Note each_note = Utilities.getNoteByName(getContext(), each_filename + Utilities.FileExtention);
each_note_array.add(each_note);
}
if (each_note_array == null || each_note_array.size() == 0) {
Toast.makeText(getActivity().getApplicationContext(), "No Notes!", Toast.LENGTH_LONG).show();
} else {
na = new MyNotesAdapter(getContext(), R.layout.item_note, each_note_array);
my_notes.setAdapter(na);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
创建MyNotesAdapter后,调用notifyDataSetChanged方法,让ListView实例知道基础数据已更改
my_notes.setAdapter(na);
na.notifyDataSetChanged();
就我个人而言,我更喜欢创建和设置适配器实例一次,然后使用其add方法来操作其底层数据。完成后,我调用适配器notifyDataSetChanged
每次数据库更改时重新创建新适配器实例可能会触发垃圾回收器更频繁地运行。我已经尝试了很多次,但它似乎并不像我预期的那样工作:/notifyDataSetChanged;它加载空视图,比如如果有3个便笺,它会加载3个空的便笺持有人,但不会显示任何信息:/i我猜这可能是我的适配器的问题,但奇怪的是,当我重新加载页面时,它会正确加载便笺,即使我旋转屏幕,它也会加载所有信息。只是不在活动的第一次开始时:/n如果视图持有者看起来是空的,请确保getView中的注释不为null。尝试删除条件检查。若它抛出空指针异常,那个么这就是空视图holderYes的原因,这正是导致它的原因。我不知道为什么,但在我刷新活动之前,getItemposition似乎正在返回null。我已经尝试了所有我能想到的lol,我非常确定当我设置adapter.Utilities.getNoteByName以某种方式返回null时,我的ArrayList不是空的。确保仅当注释不为null时才将注释添加到数组列表中。哦,这是有意义的,但是如果我的ArrayList为空,在我刷新活动时它还会加载注释吗?
private void downloadFile(final String filenames) {
final String each_filename = filenames + Utilities.FileExtention;
final long file_size = 1024 * 1024;
mNoteStorage.child(each_filename).getBytes(file_size).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
FileOutputStream stream;
FileInputStream streamIn;
try {
File dir = getActivity().getApplication().getFilesDir();
File file = new File(dir, each_filename);
stream = new FileOutputStream(file);
stream.write(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public static Note getNoteByName(Context context, String filename) {
File file = new File(context.getFilesDir(), filename);
Note note;
if (file.exists()) {
FileInputStream fis;
ObjectInputStream ois;
try {
fis = context.openFileInput(filename);
ois = new ObjectInputStream(fis);
note = (Note) ois.readObject();
fis.close();
ois.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
return note;
}
return null;
}
my_notes.setAdapter(na);
na.notifyDataSetChanged();