Android Material Design: SwipeRefreshLayout with RecyclerView and GridLayoutManager
package com.example.materialtest1
import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import androidx.core.view.GravityCompat
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.example.materialtest1.databinding.ActivityMainBinding
import com.google.android.material.snackbar.Snackbar
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
val fruits = mutableListOf(Fruit('Apple', R.drawable.apple), Fruit('Banana',
R.drawable.banana), Fruit('Orange', R.drawable.orange), Fruit('Watermelon',
R.drawable.watermelon), Fruit('Pear', R.drawable.pear), Fruit('Grape',
R.drawable.grape), Fruit('Pineapple', R.drawable.pineapple), Fruit('Strawberry',
R.drawable.strawberry), Fruit('Cherry', R.drawable.cherry), Fruit('Mango',
R.drawable.mango))
val fruitList = ArrayList<Fruit>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding=ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.toolbar)
supportActionBar?.let {
it.setDisplayHomeAsUpEnabled(true)
it.setHomeAsUpIndicator(R.drawable.ic_menu)
}
binding.navView.setCheckedItem(R.id.navCall)
binding.navView.setNavigationItemSelectedListener {
binding.drawerLayout.closeDrawers()
true
}
binding.fab.setOnClickListener {view ->
Snackbar.make(view, 'Data deleted', Snackbar.LENGTH_SHORT)
.setAction('Undo') {
Toast.makeText(this, 'Data restored', Toast.LENGTH_SHORT).show()
}
.show()
//Toast.makeText(this, 'FAB clicked', Toast.LENGTH_SHORT).show()
//Toast.makeText(this, 'FAB clicked', Toast.LENGTH_SHORT).show()
}
val swipeRefresh: SwipeRefreshLayout = findViewById(R.id.swipeRefresh)
swipeRefresh.setColorSchemeResources(com.google.android.material.R.color.design_dark_default_color_primary)
swipeRefresh.setOnRefreshListener {
refreshFruits(adapter)
}
initFruits()
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
val layoutManager = GridLayoutManager(this, 2)
recyclerView.layoutManager = layoutManager
val adapter = FruitAdapter(this, fruitList) // 实例化adapter并赋值给一个变量
recyclerView.adapter = adapter
}
@SuppressLint('NotifyDataSetChanged')
private fun refreshFruits(adapter: FruitAdapter) { // 将adapter作为参数传递给refreshFruits方法
val swipeRefresh: SwipeRefreshLayout = findViewById(R.id.swipeRefresh)
thread {
Thread.sleep(2000)
runOnUiThread {
initFruits()
adapter.notifyDataSetChanged()
swipeRefresh.isRefreshing = false
}
}
}
private fun initFruits() {
fruitList.clear()
repeat(50) {
val index = (0 until fruits.size).random()
fruitList.add(fruits[index])
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.toolbar, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.backup -> Toast.makeText(this, 'You clicked Backup', Toast.LENGTH_SHORT).show()
R.id.delete -> Toast.makeText(this, 'You clicked Delete', Toast.LENGTH_SHORT).show()
R.id.settings -> Toast.makeText(this, 'You clicked Settings', Toast.LENGTH_SHORT).show()
android.R.id.home -> binding.drawerLayout.openDrawer(GravityCompat.START)
}
return true
}
}
解决方法:
在refreshFruits方法中,你需要将adapter作为参数传递给该方法。但是在onCreate方法中,你没有将adapter实例化并赋值给一个变量。为了解决这个问题,你可以在onCreate方法中将adapter实例化并赋值给一个变量,然后将该变量传递给refreshFruits方法。修改后的代码如下:
override fun onCreate(savedInstanceState: Bundle?) {
// ...
val adapter = FruitAdapter(this, fruitList) // 实例化adapter并赋值给一个变量
recyclerView.adapter = adapter
// ...
val swipeRefresh: SwipeRefreshLayout = findViewById(R.id.swipeRefresh)
swipeRefresh.setColorSchemeResources(com.google.android.material.R.color.design_dark_default_color_primary)
swipeRefresh.setOnRefreshListener {
refreshFruits(adapter) // 将adapter作为参数传递给refreshFruits方法
}
// ...
}
原文地址: https://www.cveoy.top/t/topic/qAqk 著作权归作者所有。请勿转载和采集!