我正在嘗試在 TabLayout 中的片段上顯示 RecyclerView,該片段也是片段。但是,即使沒有錯誤,RecyclerView 仍然拒絕顯示。根據我收集的資訊,TabLayout 的片段應該有可能具有 RecyclerView。但是,我不知道問題是否在于我在片段上構建 TabLayout 導致 recyclerview 不顯示。我想我一定是做錯了什么,我需要一些幫助。這是我的代碼:
TabLayoutFragment
var viewPager = root.findViewById(R.id.viewPager) as ViewPager
var tablayout = root.findViewById(R.id.tabLayout) as TabLayout
val fragmentAdapter = FragmentAdapter(requireActivity().supportFragmentManager)
fragmentAdapter.addFragment(OpenLoansFragment(), "Active")
fragmentAdapter.addFragment(ClosedLoansFragment(), "Closed")
viewPager.adapter = fragmentAdapter
tablayout.setupWithViewPager(viewPager)
RecyclerView 片段
private lateinit var swipeRefreshLayout:SwipeRefreshLayout
private lateinit var loanRecRcv:RecyclerView
private var list: ArrayList<LoanRecordModel> = ArrayList()
private var loanRecRcvAdapter = LoanRecRcvAdapter(list, this)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentOpenLoansBinding.inflate(inflater, container, false)
val root: View = binding.root
return root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
list = arrayListOf(
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open")
)
initView()
loanRecRcv.apply{
layoutManager = LinearLayoutManager(activity)
adapter = loanRecRcvAdapter
}
}
private fun initView() {
swipeRefreshLayout = requireActivity().findViewById(R.id.swipeRefresh)
loanRecRcv = requireActivity().findViewById(R.id.loanRecRcv)
}
uj5u.com熱心網友回復:
您在RecyclerView. 首先,您在構建時創建一個空配接器:
// empty list
private var list: ArrayList<LoanRecordModel> = ArrayList()
// adapter created with the empty list
private var loanRecRcvAdapter = LoanRecRcvAdapter(list, this)
稍后您將該配接器應用到您的 RV:
loanRecRcv.apply{
...
adapter = loanRecRcvAdapter
}
您正在創建一個專案串列onViewCreated
list = arrayListOf(
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
...
)
但這正在替換存盤在list變數中的串列。您已經Adapter使用原始串列創建了較早的(構建時),因此它仍在內部使用該空串列。它沒有參考您的list變數。
兩個基本選項 - 創建list一個MutableList并更新其內容而不是替換它:
// empty mutable list - you never need to actually use ArrayLists or whatever
// made it a val so you can't replace it!
private val list = mutableListOf<LoanRecordModel>()
// pass that list object to the adapter, so it's shared
private var loanRecRcvAdapter = LoanRecRcvAdapter(list, this)
...
// update your list contents
list.addAll(listOf(
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
...
))
// notify the adapter that it needs to refresh since its data set (the shared list) has changed
adapter.notifyDataSetChanged()
或者(更好)只是將新資料傳遞給配接器并讓它在內部存盤,處理自身更新等:
// in your adapter
// store the current data here - initially an empty list, so it can still display
private var list: List<LoanRecordModel> = emptyList()
fun setData(data: List<LoanRecordModel>) {
// calling toList makes a new list object - even if the 'data' list object gets
// modified later, we have our own internal list object that won't be affected
list = data.toList()
// update the display however you like
notifyDataSetChanged()
}
// in your fragment
adapter.setData(listOf(
LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"),
...
))
這種方式更好,因為配接器的資料集是在內部保存的,而不是在您的片段中。您有一個簡單的setData函式來獲取新資料,并根據需要處理更新配接器。呼叫者不需要知道這些,它只是傳遞資料。您也可以從 ' 的建構式中洗掉您的List引數Adapter- 無論如何您都沒有將它初始化為一個空串列 - 現在這是該內部list屬性的默認值
順便說一句,要初始化相同事物的串列,您可以這樣做
// create an immutable list
val list = List(5) { LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open") }
// or add to a mutable list
list.addAll(List(5) { LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open") })
// or another way
repeat(5) {
list.add(LoanRecordModel("", "Petty Cash Loan", "12/05/2022", "Open"))
}
如果你喜歡
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514035.html
標籤:科特林安卓片段android-recyclerviewandroid-tablayout
上一篇:為什么我在使用FragmentContainerView時會收到android.view.InflateException
