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方法
    }

    // ...
}
Android Material Design: SwipeRefreshLayout with RecyclerView and GridLayoutManager

原文地址: https://www.cveoy.top/t/topic/qAqk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录