【问题标题】:recyclerView (still) not showing items on FragmentrecyclerView(仍然)不显示片段上的项目
【发布时间】:2020-01-22 16:50:55
【问题描述】:

我知道有很多与我类似的问题的帖子,我什至关注了this 和this 以及其他帖子(虽然我不会在这里列出每一个帖子)并尝试了不同的事情,但我仍然无法让我的recyclerview 在我的Fragment 上显示任何内容。

我编写一个应用程序主要用于学习目的 - 类似于 this,只是为了了解事物如何协同工作。如果你喜欢看这个项目,(至少我到目前为止所做的),你可以这样做here。

我只想在recyclerview 上显示项目。目前,recyclerview 中的任何内容都不会显示在 Fragment 中,只有白色背景:(。

我什至没有收到 任何 错误,例如“未连接适配器;跳过布局”或“未连接 LayoutManager;跳过布局”。我相信这可能是一个非常小的问题,所以请你解释一下我错过了什么或做错了什么。

非常感谢您的努力。

这是我的工作:

Adapter 代码:

class ActivitiesAdapter internal constructor(
    context: Context
) : RecyclerView.Adapter<ActivitiesAdapter.ActivitiesViewHolder>() {
    private val inflater: LayoutInflater = LayoutInflater.from(context)
    private var activities = emptyList<DoItAgainEntity>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ActivitiesViewHolder {
        val itemView = inflater.inflate(R.layout.recyclerview_item, parent, false)
        return ActivitiesViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: ActivitiesViewHolder, position: Int) {
        val current = activities[position]
        holder.activityItemView.text = current.engagement
    }

    internal fun setActivities(activities: List<DoItAgainEntity>) {
        this.activities = activities
        notifyDataSetChanged()
    }

    override fun getItemCount() = activities.size

    inner class ActivitiesViewHolder(itemview: View) : RecyclerView.ViewHolder(itemview) {
        val activityItemView: TextView = itemview.findViewById(R.id.textView)
    }
}

Fragment 代码:

class ShowDBEntriesFragment : Fragment() {

    private lateinit var viewModel: ShowDBEntriesViewModel
    private lateinit var layout: View
    private lateinit var recyclerView: RecyclerView
    private lateinit var adapter: ActivitiesAdapter

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        layout = inflater.inflate(R.layout.show_dbentries_fragment, container, false)
        adapter = ActivitiesAdapter(context!!)
        recyclerView = layout.findViewById(R.id.recyclerview)
        recyclerView.addItemDecoration(
            DividerItemDecoration(
                context!!,
                LinearLayoutManager.VERTICAL
            )
        )
        recyclerView.layoutManager =
            LinearLayoutManager(context!!, LinearLayoutManager.VERTICAL, false)
        recyclerView.adapter = adapter
        return layout
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        viewModel = ViewModelProviders.of(this).get(ShowDBEntriesViewModel::class.java)

        fab.setOnClickListener {
            val fragmentManager = (activity as MainActivity).supportFragmentManager
            val fragmentTransaction = fragmentManager.beginTransaction()
            val fragment = InsertNewEngagementFragment()
            fragmentTransaction.replace(R.id.fragment_newEngagement, fragment)
            fragmentTransaction.commit()
        }
    }

}

来自recyclerview_item.xml 的xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        style="@style/activity_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_orange_light" />

</LinearLayout>

【问题讨论】:

  • 您没有为适配器设置任何数据
  • 您在数据库中插入了任何数据吗?
  • @Md. Asaduzzaman 感谢您的帮助。我已经在我的数据库中填充了数据。 suspend fun populateDatabase(doItAgainDao: DoItAgainDao) { doItAgainDao.deleteAll() var engagement = DoItAgainEntity(1, "play guitar", 100) doItAgainDao.insert(engagement) engagement = DoItAgainEntity(2, "make breakfast", 2) doItAgainDao.insert(engagement) engagement = DoItAgainEntity(2, "go out with friends", 20) doItAgainDao.insert(engagement) }

标签: android android-fragments kotlin android-recyclerview


【解决方案1】:

你没有打电话给setActivities()。

您的代码将如下所示:

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        layout = inflater.inflate(R.layout.show_dbentries_fragment, container, false)
        adapter = ActivitiesAdapter(context!!)
        recyclerView = layout.findViewById(R.id.recyclerview)
        recyclerView.addItemDecoration(
            DividerItemDecoration(
                context!!,
                LinearLayoutManager.VERTICAL
            )
        )
        recyclerView.layoutManager =
            LinearLayoutManager(context!!, LinearLayoutManager.VERTICAL, false)
        recyclerView.adapter = adapter
        // Create activities variable
        adapter.setActivities(activities)
        return layout
    }

【讨论】:

  • 非常感谢您的帮助。但这不起作用 - activities 变量在这个地方未解决。
  • 你需要创建变量(带有一些itens)并将它传递给你的适配器,你的适配器是空的。
  • 感谢您的评论。我期待适配器会显示预填充的数据。如果您想查看 GitHub 上的项目,您会看到我用一些虚拟数据预填充了数据库。目前,适配器未显示此数据,但我也会尝试您的建议。
  • 您只在 DB 上预填充,但您必须在回收站视图中加载它,在您的活动中,您必须执行类似的操作:val data = doItAgainDao.getAll() 然后adapter.setActivities(data)。您需要从数据库中获取数据,然后在您的回收站视图中进行设置。
  • 感谢您的回复。这或多或少是 recyclerView 上未显示条目的原因。最后,我找到了解决这个问题的有效解决方案,我将分享它并接受它。但真的非常感谢你指出正确的方向。干杯。
【解决方案2】:

在recyclerview_item.xml

改变 android:layout_height="match_parent" 到 android:layout_height="wrap_content"

项目布局可能占用了整个布局空间。

【讨论】:

  • 非常感谢您的努力,但这并没有改变任何事情。
【解决方案3】:

这是这个问题的答案。我不拥有此代码。这段代码是由一个心胸宽广的天才(也是我的一个朋友)编写的,他了解事物的工作原理并编写了漂亮的代码。向你学习是我的荣幸,兄弟 - 非常感谢你的善意和你拥有的神一样的 Android 知识!保持这样的状态。

这就是——正确的做事方式:

Adapter 代码:

class ActivitiesAdapter : RecyclerView.Adapter<ActivitiesViewHolder>() {

    private var activities = emptyList<DoItAgainEntity>()

    internal fun setActivities(activities: List<DoItAgainEntity>) {
        this.activities = activities
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ActivitiesViewHolder =
        ActivitiesViewHolder(
            LayoutInflater.from(parent.context).inflate(
                R.layout.recyclerview_item,
                parent,
                false
            )
        )

    override fun onBindViewHolder(holder: ActivitiesViewHolder, position: Int) {
        holder.bind(activities[position])
    }

    override fun getItemCount() = activities.size
}

class ActivitiesViewHolder(
    override val containerView: View
) : RecyclerView.ViewHolder(containerView), LayoutContainer {

    fun bind(vo: DoItAgainEntity) {
        itemView.textView.text = vo.engagement
    }
}

Fragment 代码:

class ShowDBEntriesFragment : Fragment() {

    private lateinit var viewModel: ShowDBEntriesViewModel
    private lateinit var activitiesAdapter: ActivitiesAdapter

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        viewModel = ViewModelProviders.of(this).get(ShowDBEntriesViewModel::class.java)

        activitiesAdapter = ActivitiesAdapter()
        recyclerview.apply {
            addItemDecoration(
                DividerItemDecoration(
                    context!!,
                    LinearLayoutManager.VERTICAL
                )
            )
            layoutManager = LinearLayoutManager(context!!, LinearLayoutManager.VERTICAL, false)
            adapter = activitiesAdapter
        }

        // for testing purposes. could be deleted easily
        activitiesAdapter.setActivities(
            listOf(
                DoItAgainEntity(1, "play guitar", 100),
                DoItAgainEntity(2, "make breakfast", 2),
                DoItAgainEntity(2, "go out with friends", 20)
            )
        )

        fab.setOnClickListener {
            val fragmentManager = (activity as MainActivity).supportFragmentManager
            val fragmentTransaction = fragmentManager.beginTransaction()
            val fragment = InsertNewEngagementFragment()
            fragmentTransaction.replace(R.id.fragment_newEngagement, fragment)
            fragmentTransaction.commit()
        }
    }

}

来自recyclerview_item.xml 的xml 代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        style="@style/activity_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/holo_orange_light" />

</LinearLayout>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多