如何使用 Kotlin 在 RecyclerView 中进行无限滚动
How to make endless scrolling in RecyclerView Using Kotlin
最近我了解到用户 github api
但我很好奇,我怎样才能在回收站视图中无限滚动
这是我的 mainActivity.kt
class MainActivity : AppCompatActivity()
{
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel :MainViewModel
private lateinit var adapter: userAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
adapter = userAdapter()
adapter.notifyDataSetChanged()
viewModel = ViewModelProvider(this,ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
binding.apply {
recyclerview.layoutManager = LinearLayoutManager(this@MainActivity)
recyclerview.setHasFixedSize(false)
recyclerview.adapter = adapter
btnSearch.setOnClickListener {
searchUsers()
}
etQuery.setOnKeyListener { v, keyCode, event ->
if (event.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER){
searchUsers()
return@setOnKeyListener true
}
return@setOnKeyListener false
}
}
}
private fun searchUsers(){
binding.apply {
val query = etQuery.text.toString()
if(query.isEmpty()) return
viewModel.setSearchUsers(query)
}
viewModel.getSearchUsers().observe(this,{
if (it!=null){
adapter.setList(it)
}
})
}
}
Adapter.kt
这是我的适配器,我试过改了好像功能还是不行
// class 用户适配器:RecyclerView.Adapter() {
私有 val 列表 = ArrayList()
fun setList(user: ArrayList<user>){
list.clear()
list.addAll(user)
notifyDataSetChanged()
}
inner class UserViewHolder(val binding: UserItemListBinding) : RecyclerView.ViewHolder(binding.root){
fun bind(user: user){
binding.apply {
Glide.with(itemView)
.load(user.avatar_url)
.transition(DrawableTransitionOptions.withCrossFade())
.centerCrop()
.into(userpropic)
username.text = user.login
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val view = UserItemListBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return UserViewHolder((view))
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
holder.bind(list[position])
}
override fun getItemCount(): Int = list.size
}
Adapter.kt
这是我的适配器,我试过改了好像功能还是不行
boolean loading = true;
int pastItemsVisible, visibleItemCount, totalItemCount;
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy > 0) { //check for scroll down
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastItemsVisible = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if ((visibleItemCount + pastItemsVisible) >= totalItemCount) {
loading = false;
Log.v("...", "Last Item !");
// Do pagination.. i.e. fetch new data
loading = true;
}
}
}
}
});
最近我了解到用户 github api 但我很好奇,我怎样才能在回收站视图中无限滚动
这是我的 mainActivity.kt
class MainActivity : AppCompatActivity()
{
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel :MainViewModel
private lateinit var adapter: userAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
adapter = userAdapter()
adapter.notifyDataSetChanged()
viewModel = ViewModelProvider(this,ViewModelProvider.NewInstanceFactory()).get(MainViewModel::class.java)
binding.apply {
recyclerview.layoutManager = LinearLayoutManager(this@MainActivity)
recyclerview.setHasFixedSize(false)
recyclerview.adapter = adapter
btnSearch.setOnClickListener {
searchUsers()
}
etQuery.setOnKeyListener { v, keyCode, event ->
if (event.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER){
searchUsers()
return@setOnKeyListener true
}
return@setOnKeyListener false
}
}
}
private fun searchUsers(){
binding.apply {
val query = etQuery.text.toString()
if(query.isEmpty()) return
viewModel.setSearchUsers(query)
}
viewModel.getSearchUsers().observe(this,{
if (it!=null){
adapter.setList(it)
}
})
}
}
Adapter.kt
这是我的适配器,我试过改了好像功能还是不行
// class 用户适配器:RecyclerView.Adapter
fun setList(user: ArrayList<user>){
list.clear()
list.addAll(user)
notifyDataSetChanged()
}
inner class UserViewHolder(val binding: UserItemListBinding) : RecyclerView.ViewHolder(binding.root){
fun bind(user: user){
binding.apply {
Glide.with(itemView)
.load(user.avatar_url)
.transition(DrawableTransitionOptions.withCrossFade())
.centerCrop()
.into(userpropic)
username.text = user.login
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserViewHolder {
val view = UserItemListBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return UserViewHolder((view))
}
override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
holder.bind(list[position])
}
override fun getItemCount(): Int = list.size
}
Adapter.kt
这是我的适配器,我试过改了好像功能还是不行
boolean loading = true;
int pastItemsVisible, visibleItemCount, totalItemCount;
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy > 0) { //check for scroll down
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastItemsVisible = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if ((visibleItemCount + pastItemsVisible) >= totalItemCount) {
loading = false;
Log.v("...", "Last Item !");
// Do pagination.. i.e. fetch new data
loading = true;
}
}
}
}
});