【问题标题】:firebase to listview android studiofirebase 到 listview android studio
【发布时间】:2021-12-18 06:36:48
【问题描述】:

这是我的数据库,我想从 firebase 检索数据(红色下划线)到 Listview。

This is the picture of my XML code

这是我的java代码:

public class TimeTableActivity extends AppCompatActivity {

    ListView table01;
    DatabaseReference Trainline;
    ArrayList<String> arrayList= new ArrayList<>();
    ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_table);
        Trainline= FirebaseDatabase.getInstance().getReference("Time_table");
        table01 = findViewById(R.id.table01);
        arrayAdapter = new ArrayAdapter<String>( TimeTableActivity.this, android.R.layout.simple_list_item_1);
        table01.setAdapter(arrayAdapter);

        Trainline.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {    
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {    
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) {    
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {    
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {    
            }
        });    
    }    
}

【问题讨论】:

    标签: android firebase-realtime-database


    【解决方案1】:

    onChildAdded你可以:

    1. 从快照中读取值
    2. 将其添加到适配器所基于的列表中
    3. 告诉适配器刷新自己

    在代码中:

    arrayAdapter = new ArrayAdapter<String>(TimeTableActivity.this, 
                                            android.R.layout.simple_list_item_1, arrayList);
                                                                              // ? Add this
     Trainline.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {    
            String value = snapshot.child("time_table").getValue(String.class);  // ? 1. Get the value
            arrayList.add(value); // ? 2. Add to the array
            arrayAdapter.notifyDataSetChange(); // ? 3. Tell the adapter to repaint.
        }
        ...
    

    【讨论】:

    • 首先感谢弗兰克对我的帮助...我尝试了您的代码然后转到时间表活动突然应用程序将自动停止...这是为什么?
    • 这很难说没有看到错误。我建议查看stackoverflow.com/questions/23353173/…
    • 是的......明白了......现在它工作得很好,再次感谢弗兰克......
    • 是的,你的答案是正确的。我已经投票了,但在这里收到这样的消息“感谢您的反馈!您需要至少 15 个声望才能投票,但您的反馈已被记录。”
    • 嘿@Lakruwan 您应该能够接受答案(通过单击旁边的复选标记),因为您发布了问题。
    【解决方案2】:

    当您读取 firebase 数据库中的数据时,您应该检索整个数据。因此,无法从读取路径返回的数据中仅获取特定字段。

    因此,如果您的情况可能,我建议您在 firebase 中添加新数据,以便仅检索您需要的信息。

    为此,您可以拥有一个单独的节点,该节点可以称为 TimeTable-SpecificList 之类的名称。现在,在此表中,将用户 uid 作为您的子键,并且每个条目应只有一个您要获取的 timeTableSpecific 字段。

    例子:

    replicaTimeTable :{
          key1: {
               timeTableSpecific: "Colombo-Gampaha ..."
          },
          key2: {
               timeTableSpecific: "Colombo-Kandy ..."
          },
          key3: {...},
    
    }
    

    这个解决方案可以最大限度地减少下载冗余并优化速度!

    参考:Fetch particular fields from Firebase database

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多