簡體   English   中英

Android Studio Kotlin RecyclerView問題

[英]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 它應該像TaskListAdatperTaskListRecyclerAdatper或任何你想要的。

我看到你在打電話

RecyclerAdapter().setTasks(tasksList)

而您的 object 用於 recyclerview 是adapter ,請使用相同的 object 來調用該方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM