【发布时间】:2018-10-08 09:23:05
【问题描述】:
我正在尝试从 firebase 数据库中获取数据。
当我尝试 Toast 时,数据正在显示。但它没有显示在我的列表视图中。
这是我课堂上的代码。
mListView = (ListView) view.findViewById(R.id.mListView);
spinner = (ProgressBar) view.findViewById(R.id.progressBar);
spinner.setVisibility(View.VISIBLE);
final ArrayList<HashMap<String, String>> arraylist = new ArrayList<HashMap<String, String>>();
final HashMap<String, String> map = new HashMap<String, String>();
Toast.makeText(getActivity(),username,Toast.LENGTH_LONG).show();
usersRef = FirebaseDatabase.getInstance().getReference("Users/"+username);
usersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
final String cuid = ds.child("cuid").getValue(String.class);
String name = ds.child("cuname").getValue(String.class);
final String newname = name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
chatRef = FirebaseDatabase.getInstance().getReference("Chats").child(cuid + " " + username);
chatRef.orderByKey().limitToLast(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String senderid = ds.child("senderid").getValue(String.class);
String message = ds.child("message").getValue(String.class);
String syou;
if (!senderid.equals(cuid)) {
syou = "You: ";
} else {
syou = "";
}
map.put("name", newname);
map.put("lastchat", syou + "" + message);
Toast.makeText(getActivity(),newname+" : "+message,Toast.LENGTH_LONG).show();
arraylist.add(map);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
adapter = new ListViewAdapter(getActivity(), arraylist);
mListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
spinner.setVisibility(View.INVISIBLE);
}else{
Toast.makeText(getActivity(),"NO RESULT!",Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
此 Toast 正在运行,但列表未显示在我的列表视图中。
Toast.makeText(getActivity(),newname+" : "+message,Toast.LENGTH_LONG).show();
这是我的适配器
public class ListViewAdapter extends BaseAdapter {
boolean expanded = false;
Context context;
LayoutInflater inflater;
ArrayList<HashMap<String, String>> data;
HashMap<String, String> resultp = new HashMap<String, String>();
public ListViewAdapter(Context context,
ArrayList<HashMap<String, String>> arraylist) {
this.context = context;
data = arraylist;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
TextView name, lastchat;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.item, parent, false);
resultp = data.get(position);
name = (TextView) itemView.findViewById(R.id.name);
name.setText(resultp.get(FragmentAll.name));
lastchat = (TextView) itemView.findViewById(R.id.lastchat);
lastchat.setText(resultp.get(FragmentAll.lastchat));
return itemView;
}
}
我试图搜索这个问题,但我找不到解决问题的方法。
希望有人能帮我解决这个问题。
谢谢。
【问题讨论】:
-
尝试在
arraylist.add(map);之后设置Adapter -
它复制了结果。可能是因为 for 循环。
-
是的。在循环之后尝试。
-
addValueEventListener()是异步调用,它立即返回。虽然它仍在获取新的 DataSnapshot 的过程中,但您正在使用其中没有任何元素的列表设置适配器。您应该等待异步调用完成,然后设置适配器或将数据更改通知适配器。
标签: android firebase listview firebase-realtime-database