RecyclerView 未显示在屏幕上

RecyclerView doesn't appear on the screen

提问人:Dmytro 提问时间:9/3/2023 最后编辑:Brian Tompsett - 汤莱恩Dmytro 更新时间:10/8/2023 访问量:32

问:

我制作了一个使用 API 的应用程序,应该在屏幕上显示一些基本数据(汇率)。 但是元素不会出现在屏幕上。我只能看到文本视图。 试图找问题一天,什么也做不了。recyclerView

screen

下面是一些代码:

StartFragment:

class StartFragment : Fragment() {

    private lateinit var binding: FragmentStartBinding
    private lateinit var recyclerView: RecyclerView
    private lateinit var adapter: StartAdapter

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        // Inflate the layout for this fragment
        binding = FragmentStartBinding.inflate(inflater, container, false)

        val viewModel = ViewModelProvider(this)[StartViewModel::class.java]
        recyclerView = binding.rvStart
        adapter = StartAdapter()
        recyclerView.adapter = adapter
        viewModel.getCash()
        viewModel.myCashList.observe(viewLifecycleOwner) { list ->
            list.body()?.let { adapter.setList(it) }
        }

        return binding.root
    }
}

启动适配器:

class StartAdapter:RecyclerView.Adapter<StartAdapter.StartViewHolder>() {

    private var listStart = emptyList<CashItem>()

    class StartViewHolder(val binding: ItemMoneyLayoutBinding):RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StartViewHolder {
        val binding = ItemMoneyLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return StartViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return listStart.size
    }

    override fun onBindViewHolder(holder: StartViewHolder, position: Int) {
        holder.binding.itemName.text = listStart[position].ccy
        holder.binding.itemBuy.text = listStart[position].buy
        holder.binding.itemSale.text = listStart[position].sale
    }

    @SuppressLint("NotifyDataSetChanged")
    fun setList(list: List<CashItem>){
        listStart = list
        notifyDataSetChanged()
    }
}

fragment_start.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".screens.start.StartFragment">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</FrameLayout>

存储 库:

class Repository {

    suspend fun getCashMoney(): Response<Cash>{
        return RetrofitInstance.api.getCash()
    }

    suspend fun getNonCashMoney(): Response<NonCash>{
        return RetrofitInstance.api.getNonCash()
    }
}

只是试图删除textview“开始”,因为它可能会阻止rv。 任何其他更改代码的尝试都失败。我想使用 viewBinding 可能是一个问题,但我找不到确切的位置。

android kotlin android-viewbinding

评论


答:

1赞 storytellerF 9/3/2023 #1

缺少 LayoutManager。

就像这样:

recycleView.layoutManager = LinearLayoutManager(context)