在列表视图中显示 firebase 子对象

Posted

技术标签:

【中文标题】在列表视图中显示 firebase 子对象【英文标题】:Display firebase child objects in listview 【发布时间】:2017-01-26 06:30:33 【问题描述】:

我是 Firebase 的新手。我正在尝试查询 firebase 数据库并在 ListView 中显示结果的所有子对象。我没有错误,但没有显示任何内容。它不会崩溃,但也不会做任何事情。请帮帮我。

我的数据库的内容:

这是我的数据检索代码:

 imgbtn.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                key = search.getText().toString().trim();
                Firebase newRef = new Firebase("https://stockmanager-142503.firebaseio.com/Items");
                Query query = newRef.orderByChild("Idno").equalTo(key);
                query.addChildEventListener(new ChildEventListener() 
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) 

                        Map<String,Item> td = (HashMap<String,Item>) dataSnapshot.getValue();

                        List<Item> valuesToMatch = new ArrayList<Item>(td.values());
                        myAdapter myadapter=new myAdapter(getActivity(),valuesToMatch);
                        mlistView.setAdapter(myadapter);
                    

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

                    

                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) 

                    

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

                    

                    @Override
                    public void onCancelled(FirebaseError firebaseError) 

                        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                        builder.setMessage(firebaseError.getMessage())
                                .setTitle("Error!")
                                .setPositiveButton(android.R.string.ok, null);
                        AlertDialog dialog = builder.create();
                        dialog.show();


                    
                );

这是我的适配器类:

public class myAdapter extends BaseAdapter 
    private List<Item> items;
    private Context mContext;


    public myAdapter(Context mContext, List<Item> items) 
        this.mContext=mContext;
        this.items=items;
    

    @Override
    public int getCount() 
        return 0;
    

    @Override
    public Object getItem(int i) 
        return null;
    

    @Override
    public long getItemId(int i) 
        return 0;
    

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) 
        LinearLayout linearLayout;
        Item item=items.get(i);
        if (view == null) 
            linearLayout = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.rowitem, viewGroup, false);
         else 
            linearLayout = (LinearLayout)view;
        
        TextView text1=(TextView)linearLayout.findViewById(R.id.text1);
        TextView text2=(TextView)linearLayout.findViewById(R.id.text2);
        TextView text3=(TextView)linearLayout.findViewById(R.id.text3);
        TextView text4=(TextView)linearLayout.findViewById(R.id.text4);
        TextView text5=(TextView)linearLayout.findViewById(R.id.text5);
        text1.setText(item.getIdno());
        text2.setText(item.getName());
        text3.setText(item.getBrand());
        text4.setText(item.getCost());
        text5.setText(item.getDate());


        return null;

    

这里是物品类别:

public class Item 
    private String Type;
    private String Name;
    private String Brand;
    private String Cost;
    private String Date;
    private String Store;
    private String Idno;

    public String getName() 
        return Name;
    

    public String getIdno() 
        return Idno;
    


    public String getCost() 
        return Cost;
    

    public void setDate(String date) 
        Date = date;
    

    public String getBrand() 
        return Brand;
    




    public String getStore() 
        return Store;
    



    public String getType() 
        return Type;
    

    public String getDate() 
        return Date;
    



【问题讨论】:

你有没有在onChildAdded中设置断点,看看是否被触发? 是的。方法没有被触发。怎么办? 我会检查是否触发了onCancelled(),我认为可能是。另外:您正在使用 Firebase 2.x SDK。虽然这可能有效,但我建议使用更新的 3.x SDK,即documented here。 也没有触发。 在您添加 childEventListener 之前,key 的值是多少,您确定该值实际上在您的数据库中吗? 【参考方案1】:

我自己修好了。显然,查询返回了一个对象列表,因此我用 for 循环替换了 Hashmap 以获取子对象并将它们添加到列表中。但我的列表视图根本不会显示检索到的数据。最后,我使用了下面给出的 firebase UI List Adpater 并修复了它。谢谢大家!

  imgbtn.setOnClickListener(new View.OnClickListener() 
                                      @Override
                                      public void onClick(View view) 
                                          key = scanContent;
                                          Query q = dbRef.orderByChild("idno").equalTo(key);
                                          FirebaseListAdapter<Item> adapter =new FirebaseListAdapter<Item>(getActivity(),Item.class,R.layout.rowitem,q) 
                                              @Override
                                              protected void populateView(View v, Item item, int position) 
                                                  TextView text1=(TextView)v.findViewById(R.id.text1);
                                                  TextView text2=(TextView)v.findViewById(R.id.text2);
                                                  TextView text3=(TextView)v.findViewById(R.id.text3);
                                                  TextView text4=(TextView)v.findViewById(R.id.text4);
                                                  TextView text5=(TextView)v.findViewById(R.id.text5);
                                                  text1.setText(item.getIdno());
                                                  text2.setText(item.getName());
                                                  text3.setText(item.getBrand());
                                                  text4.setText(item.getCost());
                                                  text5.setText(item.getDate());
                                                  solditem=item;
                                              
                                          ;
                                          sell.setText("Add this result to Sold Items List?");
                                      sList.setAdapter(adapter);
                                      
                                  );

【讨论】:

以上是关于在列表视图中显示 firebase 子对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在firebase(swift)中获取子节点的值,并将其显示在视图控制器的标签中

添加数据时,Firebase 列表视图未实时显示

列表视图不显示来自firebase数据库的任何内容

列表视图未显示我来自 FIREBASE 的项目

仅显示一项的列表视图

从Firebase数据库中获取子代数,并将其放在一个数组列表中。