![](/img/trans.png)
[英]Problem with RecyclerView and getFilter in Android Studio
[英]Android Studio Kotlin RecyclerView problem
我在顯示我的 RecyclerView 時遇到問題。 據我所見,我似乎沒有省略設置的任何重要部分。 你能幫我找出問題嗎?
Model - class 我在其中檢索和存儲所有數據,例如 id、狀態、任務
class Model() {
private var id: Int = -1
private var status: Boolean = false
private var task: String = ""
fun getId(): Int {
return id
}
fun setId(id: Int){
this.id = id
}
fun getStatus(): Boolean {
return status
}
fun setStatus(status: Boolean) {
this.status = status
}
fun getTask(): String {
return task
}
fun setTask(task: String) {
this.task = task
Adapter - 這是recyclerview的一個適配器。 我認為更新信息存在問題。 負責的 function 是 setTasks()
class RecyclerAdapter : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>() {
var data = listOf<Model>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.task_layout, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = data[position]
holder.task.text = item.getTask()
holder.task.isChecked = item.getStatus()
}
override fun getItemCount() = data.size
fun setTasks(data: List<Model>) {
this.data = data
notifyDataSetChanged()
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val task : CheckBox = itemView.findViewById(R.id.checkbox_task)
}
}
MainFragment - 這是我要在其上顯示 recyclerview 的片段。 在底部我添加了一些簡單的“硬”任務,只是為了檢查一切是否正確顯示
class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!
private var layoutManager: RecyclerView.LayoutManager? = null
private var adapter: RecyclerView.Adapter<RecyclerAdapter.ViewHolder>? = null
private val tasksList = mutableListOf<Model>()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
_binding = FragmentMainBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tasksRecyclerview.apply {
layoutManager = LinearLayoutManager(context)
adapter = RecyclerAdapter()
itemAnimator = DefaultItemAnimator()
}
val task = Model()
task.setTask("This is a task")
task.setStatus(false)
task.setId(1)
tasksList.add(task)
tasksList.add(task)
tasksList.add(task)
tasksList.add(task)
tasksList.add(task)
RecyclerAdapter().setTasks(tasksList)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
請檢查以下代碼並查看評論:
class MainFragment : Fragment() {
private var _binding: FragmentMainBinding? = null
private val binding get() = _binding!!
/*
* Note: Declaration of RecyclerAdapter
* */
private var savedAdapter: RecyclerAdapter? = null
private val tasksList = mutableListOf<Model>()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
_binding = FragmentMainBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
savedAdapter = RecyclerAdapter()
binding.tasksRecyclerview.apply {
layoutManager = LinearLayoutManager(context)
adapter = savedAdapter
itemAnimator = DefaultItemAnimator()
}
/*
* Note: You can use repeat() to add dummy data in your list
* */
repeat(10) {
tasksList.add(Model().apply {
setTask("This is a task")
setStatus(false)
setId(it + 1)
})
}
/*
* Note: Use same RecyclerView Adapter object to access method
* */
savedAdapter?.setTasks(tasksList)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
此外,嘗試在不使用預定義keywords
的情況下創建類,對於用戶定義的 class 名稱僅使用keywords
不是一個好習慣。 由於您的Adapter
class 名稱是RecyclerAdapter
。 它應該像TaskListAdatper
或TaskListRecyclerAdatper
或任何你想要的。
我看到你在打電話
RecyclerAdapter().setTasks(tasksList)
而您的 object 用於 recyclerview 是adapter
,請使用相同的 object 來調用該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.