始终从 RecycleViewAdapter 获取项目的默认值

Getting always default values of items from RecycleViewAdapter

我有一个有回收视图的 activity。回收视图的每个项目都有 3 个组件:微调器、EditText 和一个 ImageButton

在 activity 中,有一个“添加用户”按钮可以将 recycleViewer 中的所有信息保存到数据库中。为了提供更多上下文,还有一个“添加用户”按钮,可以将另一个项目添加到 recycleViewer

问题是,当我从 activity 调用 saveUsers 函数时,调用 newUserAdapter.getUsers() 的函数总是 returns RecycleView 为空(editText 和 Spinner),即使用户修改了 recycleView

上的信息

这是我的 activity


class AddUser : AppCompatActivity() {
    private lateinit var binding: ActivityAddUserBinding
    private lateinit var newUserAdapter : AddUserRecyclerViewAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityAddUserBinding.inflate(layoutInflater)
        newUserAdapter = AddUserRecyclerViewAdapter()
        val b = User("","")
        newUserAdapter.addItem(b)

        binding.recyclerViewUser.adapter = newUserAdapter
        setContentView(binding.root)
    }

    fun addNewUserRow(view: View) {
        Timber.i("AddUser addNewUserRow called")
        val b = User("","")
        newUserAdapter.addItem(b)
    }


    fun saveUsers(view: View) {
        if(newUserAdapter.itemCount > 0)
        {
            var usr = newUserAdapter.getUsers()
            //TODO: save usr to DataBase
        }
        else
        {
            Snackbar.make(view, R.string.delete_user, Snackbar.LENGTH_LONG).show()
        }
    }
}

这是我的用户数据class:

data class User (
    var name: String = String(),
    var department: String = String()
    )

还有我的 RecycleViewAdapter:

class AddUserRecyclerViewAdapter : RecyclerView.Adapter<AddUserRecyclerViewAdapter.AddUserViewHolder>() {
    private var allUsers = ArrayList<User>()
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AddUserViewHolder {
        Timber.i("User onCreateViewHolder")
        val view = AddUserItemBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )
        val tempUser = AddUserViewHolder(view)
        tempUser.deleteBtn.setOnClickListener {
            Timber.i("NewUser setOnClickListener " + tempUser.bindingAdapterPosition)
            if (this.itemCount > 1)
            {
                deleteItem(tempUser.bindingAdapterPosition)
            }
            else
            {
                //At least one item, we don't let delete the last one
                Snackbar.make(it, R.string.delete_user, Snackbar.LENGTH_LONG).show()
            }
        }

        return tempUser
    }

    override fun onBindViewHolder(holderUser: AddUserViewHolder, position: Int) {
        Timber.i("NewUser onBindViewHolder $position")
        val item = allUsers[position]
        holderUser.nameEt.setText(item.name.toString())

    }

    private fun deleteItem(pos: Int) {
        Timber.i("NewUser deleteItem $pos")
        allUsers.removeAt(pos)
        // call notifyDataSetChanged() to notify our adapter.
        notifyItemRemoved(pos)
    }

    fun addItem(item: User) {
        allUsers.add(item)
        // call notifyDataSetChanged() to notify our adapter.
        notifyItemInserted(allUsers.size -1)
    }

    fun getUsers(): ArrayList<User> {
        return allUsers
    }

    override fun getItemCount(): Int {
        Timber.i("NewUser getItemCount called" + allUsers.size)
        return allUsers.size
    }

    inner class AddUserViewHolder(binding: AddUserItemBinding) :
        RecyclerView.ViewHolder(binding.root) {

        var nameEt: EditText = binding.etName
        var deleteBtn : ImageButton = binding.btnDelete
        var spinnerDepartment : Spinner = binding.spinnerDepartment
    }

}

编辑

似乎有人因为缺乏信息而投了反对票,让我换句话说。这是 RecycleViewAdapter 中的函数:

 fun getUsers(): ArrayList<User> {
        return allUsers
    }

单击 activity 中的按钮时调用谁:

fun saveUsers(view: View) {
        if(newUserAdapter.itemCount > 0)
        {
            var usr = newUserAdapter.getUsers()
            //TODO: save usr to DataBase
        }
        else
        {
            Snackbar.make(view, R.string.delete_user, Snackbar.LENGTH_LONG).show()
        }
    }

所以 var usr 是我获取空用户列表的地方,我希望在其中获取 RecycleView 中填写的信息的用户列表。

当您使用 addTextChangedListener

更改文本时,您应该更新 ArrayList 中用户的 属性
    override fun onBindViewHolder(holderUser: AddUserViewHolder, position: Int) {
        Timber.i("NewUser onBindViewHolder $position")
        val item = allUsers[position]
        holderUser.nameEt.setText(item.name.toString())
        holderUser.nameEt.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(p0: Editable?) { }
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { }
            override fun onTextChanged(text: CharSequence?, p1: Int, p2: Int, p3: Int) {
                // Update user instance in allUsers
                allUsers[position].name = text.toString()
            }
        })
    }

您可能还想在 Spinner 上定义一个 onItemSelectedListener 来更新所选部门。