【问题标题】:Firebase database not showing in listview [duplicate]Firebase数据库未显示在列表视图中[重复]
【发布时间】: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


【解决方案1】:

使用addListenerForSingleValueEvent 而不是addValueEventListener

那就做吧,

adapter = new ListViewAdapter(getActivity(), arraylist);
mListView.setAdapter(adapter);

初始化回收站视图后, 然后

adapter.notifyDataSetChanged();

在 onDataChange() 上获取数据后

【讨论】:

  • 工作,但它只是循环相同的结果。
  • 你可能在 for 循环中有适配器通知。
  • 您可以编辑我的脚本并将其发布为答案吗?我总是得到相同的结果。它只是循环一个值。谢谢
  • 我试过你的答案,但它只是显示相同的值。像乔,乔,乔,乔,乔,乔。
【解决方案2】:

您还应该在第二个onDataChange() 中调用notifyDataSetChanged()

   arraylist.add(map);
}
adapter.notifyDataSetChanged();

我也使用 OnError,所以当问题出在其他地方时,我不会浪费时间。

另外,请注意Toast 需要ApplicationContext

【讨论】:

  • 工作,但它只是循环相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
相关资源
最近更新 更多