【问题标题】:Not able to display ArrayList items into multi column ListView无法将 ArrayList 项目显示到多列 ListView
【发布时间】:2017-11-06 18:06:56
【问题描述】:

在我的 LogCat 中,我有这些从我的 firebase 数据库中提取的详细信息。

06-05 16:14:09.454 D: 3. DataSnapshot VALUE : {familyName=Richardson, children=[Sam, Jin, Peter], fatherName=Daniel, checkInTime=Mon, Jun 05 04:13 PM}
06-05 16:14:09.456 D: 4. DataSnapshot VALUE : {motherName=Alice, checkOutTime=Mon, Jun 05 04:13 PM, familyName=Richardson, children=[Sam, Peter, Jin]}

我使用多列 ListView 来显示以下数据。但是,这里的问题是我无法显示children 数据,因为它是一个ArrayListChildren 列中仅显示 ArrayList 的最后一个值。

如何在多列 ListView 中显示 ArrayList 的所有值。谁能推荐我?

这是我的代码:

checkInCheckOutDBReference.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    int i = 0;
    for (DataSnapshot ds: dataSnapshot.getChildren()) {
      i++;
      String fatherNameValue = ds.child("fatherName").getValue(String.class);
      String motherNameValue = ds.child("motherName").getValue(String.class);

      HashMap < String, String > record = new HashMap < > ();

      Log.d(TAG, i + ". DataSnapshot VALUE : " + ds.getValue());

      familyNameColumn = ds.child("familyName").getValue(String.class);
      record.put(FAMILY_NAME_COLUMN, familyNameColumn);

      for (DataSnapshot cds: ds.child("children").getChildren()) {
        record.put(CHILD_NAME_COLUMN, cds.getValue().toString());
      }
      // CHECK IN TIME
      checkInTime = ds.child("checkInTime").getValue(String.class);
      record.put(CHECKIN_COLUMN, checkInTime);
      // CHECKOUT TIME
      checkOutTime = ds.child("checkOutTime").getValue(String.class);
      record.put(CHECKOUT_COLUMN, checkOutTime);

      for (DataSnapshot snap: ds.getChildren()) {
        Log.d(TAG, "*Key: " + snap.getKey());
        if (snap.getKey().equals("checkInTime")) {
          myCheckIn = "1";
          myCheckOut = "0";
        }
        if (snap.getKey().equals("checkOutTime")) {
          myCheckOut = "1";
          myCheckIn = "0";
        }
        if (snap.getKey().equals("fatherName")) {
          myParent = fatherNameValue;
        }
        if (snap.getKey().equals("motherName"))
          myParent = motherNameValue;
      }
      if (myCheckIn.equals("1")) {
        record.put(PARENT_CHECKIN_COLUMN, myParent);
      }
      if (myCheckOut.equals("1")) {
        record.put(PARENT_CHECKOUT_COLUMN, myParent);
      }
      list.add(record);
      ReportAdapter adapter = new ReportAdapter(GeneratereportActivity.this, list);
      reportListView.setAdapter(adapter);
    }

  }
  @Override
  public void onCancelled(DatabaseError databaseError) {}
});

【问题讨论】:

    标签: android listview firebase arraylist firebase-realtime-database


    【解决方案1】:

    将你的适配器代码放在你的 for 循环之外,并为变量记录创建新对象

    ReportAdapter adapter = new ReportAdapter(GeneratereportActivity.this, list);
    reportListView.setAdapter(adapter);
    

    否则像这样,每次对象都会覆盖并且你只会最后一个值

        checkInCheckOutDBReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                int i = 0;
                for (DataSnapshot ds: dataSnapshot.getChildren()) {
                    i++;
    
                    record = new //your object
                    String fatherNameValue = ds.child("fatherName").getValue(String.class);
                    String motherNameValue = ds.child("motherName").getValue(String.class);
    
                    HashMap < String, String > record = new HashMap < > ();
    
                    Log.d(TAG, i + ". DataSnapshot VALUE : " + ds.getValue());
    
                    familyNameColumn = ds.child("familyName").getValue(String.class);
                    record.put(FAMILY_NAME_COLUMN, familyNameColumn);
    
                    for (DataSnapshot cds: ds.child("children").getChildren()) {
                        record.put(CHILD_NAME_COLUMN, cds.getValue().toString());
                    }
                    // CHECK IN TIME
                    checkInTime = ds.child("checkInTime").getValue(String.class);
                    record.put(CHECKIN_COLUMN, checkInTime);
                    // CHECKOUT TIME
                    checkOutTime = ds.child("checkOutTime").getValue(String.class);
                    record.put(CHECKOUT_COLUMN, checkOutTime);
    
                    for (DataSnapshot snap: ds.getChildren()) {
                        Log.d(TAG, "*Key: " + snap.getKey());
                        if (snap.getKey().equals("checkInTime")) {
                            myCheckIn = "1";
                            myCheckOut = "0";
                        }
                        if (snap.getKey().equals("checkOutTime")) {
                            myCheckOut = "1";
                            myCheckIn = "0";
                        }
                        if (snap.getKey().equals("fatherName")) {
                            myParent = fatherNameValue;
                        }
                        if (snap.getKey().equals("motherName"))
                            myParent = motherNameValue;
                    }
                    if (myCheckIn.equals("1")) {
                        record.put(PARENT_CHECKIN_COLUMN, myParent);
                    }
                    if (myCheckOut.equals("1")) {
                        record.put(PARENT_CHECKOUT_COLUMN, myParent);
                    }
                    list.add(record);
    
                }
    
                ReportAdapter adapter = new ReportAdapter(GeneratereportActivity.this, list);
                reportListView.setAdapter(adapter);
    
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });
    

    【讨论】:

    • 即使现在也只显示最后一个值。这实际上指的是什么? record = new //your object我已经有这个声明了。 HashMap &lt; String, String &gt; record = new HashMap &lt; &gt; ();
    • 您是否将 HashMap 列表设置到适配器..?
    • 是的,我在此声明中就是这样做的。 ReportAdapter adapter = new ReportAdapter(GeneratereportActivity.this, list); 。在该列表中有所有记录。
    • 然后在记录的地方 = new //你的对象,添加记录 = new HashMap ();并使用上面的代码就可以了。
    • 我没有得到对象是什么。在这段代码中,您能说出您指的是哪个对象吗?这里record 是一个HashMap 变量。我没有任何名为 Record 的类来创建它的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2014-05-20
    • 2011-12-19
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多