【问题标题】:Firebase - Get all Children and add to ListViewFirebase - 获取所有孩子并添加到 ListView
【发布时间】:2018-08-07 04:58:11
【问题描述】:

我在一个活动中有 4 个片段,即数据库片段,当前包含将查询 Firebase 以从父节点“资产”获取子节点的 ListView。此外,ListView 有一个自定义适配器,使其具有标题和副标题。

这是数据库结构

这是主要活动:

private var toolbar: ActionBar? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    toolbar = supportActionBar

    toolbar?.title = resources.getString(R.string.navigation_database)
    loadFragment(DatabaseFragment())

    setNavigation()
}
private fun setNavigation(){
    val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigation)
    bottomNavigationView.setOnNavigationItemSelectedListener { item ->

        var fragment: Fragment

        when (item.itemId) {
            R.id.navigation_database -> {
                toolbar?.title = resources.getString(R.string.navigation_database)
                fragment = DatabaseFragment()
                loadFragment(fragment)
            }
            R.id.navigation_track -> {
                toolbar?.title = resources.getString(R.string.navigation_tracking)
                fragment = TrackingFragment()
                loadFragment(fragment)
            }
            R.id.navigation_activities -> {
                toolbar?.title = resources.getString(R.string.navigation_activities)
                fragment = ActivitiesFragment()
                loadFragment(fragment)
            }
            R.id.navigation_references -> {
                toolbar?.title = resources.getString(R.string.navigation_references)
                fragment = ReferencesFragment()
                loadFragment(fragment)
            }
        }
        true
    }
}
private fun loadFragment(fragment: Fragment){
    val fragmentTransaction = supportFragmentManager.beginTransaction()
    fragmentTransaction.replace(R.id.childLayout, fragment)
    fragmentTransaction.addToBackStack(null)
    fragmentTransaction.commit()
}

这是数据库片段:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val rootView = inflater.inflate(R.layout.fragment_database, container, false)

    val titleList = ArrayList<String>()
    val subtitleList = ArrayList<String>()

    val databaseReference = FirebaseDatabase.getInstance().getReference("Assets")
    databaseReference.addValueEventListener(object : ValueEventListener{
        override fun onCancelled(databaseError: DatabaseError) {
        }

        override fun onDataChange(dataSnapshot: DataSnapshot) {
            for(childSnapshot: DataSnapshot in dataSnapshot.children){
                titleList.add(childSnapshot.key.toString())
                subtitleList.add("subtitle")
            }
        }

    })

    val listView = rootView.findViewById(R.id.databaseListView) as ListView
    val adapter = DatabaseListAdapter(activity as MainActivity, titleList, subtitleList)
    listView.adapter = adapter

    return rootView
}

这是自定义适配器:

public Context context;
public ArrayList<String> titleList;
public ArrayList<String> subtitleList;

public DatabaseListAdapter(Context context, ArrayList<String> titleList, ArrayList<String> subtitleList){
    this.context = context;
    this.titleList = titleList;
    this.subtitleList = subtitleList;
}

@Override
public int getCount() {
    return titleList.size();
}

@Override
public Object getItem(int position) {
    return titleList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rootView = LayoutInflater.from(context).inflate(R.layout.layout_listview_database, parent, false);

    TextView titleView = rootView.findViewById(R.id.titleView);
    TextView subtitleView = rootView.findViewById(R.id.subtitleView);

    titleView.setText(titleList.get(position));
    subtitleView.setText(subtitleList.get(position));

    return rootView;
}

Firebase 数据库规则:

{
"rules": {
".read": true,
".write": true
   }
}

【问题讨论】:

  • 请提及您的问题陈述!
  • 我目前无法编辑帖子,但 listView 没有显示任何项目
  • 看看我的回答再告诉我一件事 subtitleList.add("subtitle") 为什么要添加这个静态数据“subtitle”。?
  • 好吧,我目前正专注于获取将显示为标题的子键
  • 运行下面的代码并检查。你有没有得到数据。?并发布您对 firebase 数据库的读写规则

标签: android firebase firebase-realtime-database kotlin


【解决方案1】:

override fun onDataChange(dataSnapshot: DataSnapshot) 中,将所有内容添加到列表后,您需要致电adapter.notifyDataSetChanged()

您可以保留对适配器的全局 var 引用,或者通过 ID 查找回收器视图并获取其适配器。

您可能还想在添加内容之前清除列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多