簡體   English   中英

RecyclerView 適配器方法沒有被調用 kotlin

[英]RecyclerView Adapter methods not getting called kotlin

在適配器方法中。 我能夠在updateUsers(newUsers: List)中打印列表元素,這意味着我正在適配器中獲取數據集,但沒有調用任何適配器方法。 我也設置了布局管理器。

我有所有適配器方法 onCreateViewHolder、onBindViewHolder 的斷點。 但控制沒有進入代碼塊。

class MainActivity : AppCompatActivity() {
    lateinit var viewModel: ListViewModel
    private val usersAdapter = UserListAdapter(arrayListOf(),this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProviders.of(this).get(ListViewModel::class.java)
        viewModel.refresh()


        usersList.apply {
            layoutManager = LinearLayoutManager(this.context)
            adapter = usersAdapter
        }
        usersList.adapter = usersAdapter


        observeViewModel()
    }

    fun observeViewModel() {

        viewModel.users.observe(this, Observer {
            it?.let {
               it.forEach {
                  Log.d("Each Item", it.toString());
               }
                loading_view.visibility = View.VISIBLE
                usersAdapter.updateUsers(it)
            }
        })


        viewModel.userLoadError.observe(this, Observer {
            it?.let {
                list_error.visibility = if (it) View.VISIBLE else View.GONE
            }
        })

        viewModel.loading.observe(this, Observer {
            it?.let {
                loading_view.visibility = if (it) View.VISIBLE else View.GONE
                if (it) {
                    list_error.visibility = View.GONE
                    usersList.visibility = View.GONE
                }

            }
        })


    }



}


class UserListAdapter(private var users: ArrayList<User>, private val context : Context) : RecyclerView.Adapter<UserListAdapter.UserViewHolder>() {

    fun updateUsers(newUsers: List<User>) {
        newUsers.forEach() {
            Log.d("updateUsers", it.firstName)
        }
        users.clear()
        users.addAll(newUsers)
        notifyDataSetChanged()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : UserViewHolder{
        val layoutInflator = LayoutInflater.from(parent.context)
        val view = layoutInflator.inflate(R.layout.item_layout,parent,false)
       return UserViewHolder(view)
    }

    override fun getItemCount():Int {
        return users.size
    }
    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        holder.bind(users[position])
    }


    class UserViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        private val imageView = view.imageView
        private val userName = view.name
        private val userEmail = view.email

        fun bind(country: User) {
            userName.text = country.firstName + " " + country.lastName
            userEmail.text = country.email
            imageView.loadImage(country.avatar)
        }
    }

}

我不完全確定您的代碼為什么不起作用,在這里我已經使用您的代碼實現並且它正在工作。

主要活動

class MainActivity : AppCompatActivity() {

private lateinit var viewModel: ListViewModel

private val usersAdapter = UserListAdapter(arrayListOf(), this)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    viewModel = ViewModelProviders.of(this).get(ListViewModel::class.java)
    viewModel.refresh()

    usersList.apply {
        layoutManager = LinearLayoutManager(this.context, 
              RecyclerView.VERTICAL, false)
        adapter = usersAdapter
    }
   // usersList.adapter = usersAdapter // Don't need, you already set the 
   //      adapter above.

    observeViewModel()
}

private fun observeViewModel() {

    viewModel.users.observe(this, Observer {
        it?.let {
            it.forEach {
                Log.d("Each Item", it.toString());
            }
           //loading_view.visibility = View.VISIBLE
            usersAdapter.updateUsers(it)
        }
    })

    // commented for simplicity
    //viewModel.userLoadError.observe(this, Observer {
    // it?.let {
    //list_error.visibility = if (it) View.VISIBLE else View.GONE
     // }
   //})

   // viewModel.loading.observe(this, Observer {
   // it?.let {
   // loading_view.visibility = if (it) View.VISIBLE else View.GONE
   // if (it) {
   // list_error.visibility = View.GONE
   // usersList.visibility = View.GONE
   //  }
   //
   // }
   // })
   }
}

用戶列表適配器

class UserListAdapter(private var users: ArrayList<User>, private val context : Context) : RecyclerView.Adapter<UserListAdapter.UserViewHolder>() {

fun updateUsers(newUsers: List<User>) {
    newUsers.forEach() {
        Log.d("updateUsers", it.firstName)
    }
    users.clear()
    users.addAll(newUsers)
    notifyDataSetChanged()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : UserViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    val view = inflater.inflate(R.layout.item_layout,parent,false)
    return UserViewHolder(view)
}

override fun getItemCount():Int {
    return users.size
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
    holder.bind(users[position])
}


class UserViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    private val imageView = view.imageView
    private val userName = view.name
    private val userEmail = view.email

    fun bind(country: User) {
        userName.text = country.firstName + " " + country.lastName
        userEmail.text = country.email
       //imageView.loadImage(country.avatar)
     }
  }
}

列表視圖模型

class ListViewModel: ViewModel() {

val users : MutableLiveData<List<User>> = MutableLiveData()

fun refresh() {

    val userList = mutableListOf<User>()

    userList.add(User(
            "User1 First Name",
            "User1 last Name",
            "example@gmail.com"
    ))
    userList.add(User(
            "User2 First Name",
            "User2 First Name",
            "example@gmail.com"
    ))
    userList.add(User(
            "User3 First Name",
            "User3 First Name",
            "example@gmail.com"
    ))
    userList.add(User(
            "User4 First Name",
            "User4 First Name",
            "example@gmail.com"
    ))
    userList.add(User(
            "User5 First Name",
            "User5 First Name",
            "example@gmail.com"
    ))
    userList.add(User(
            "User6 First Name",
            "User6 First Name",
            "example@gmail.com"
    ))
    users.value = userList
 }

}

希望這可以幫助。

暫無
暫無

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

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