Intent 不适用于 RecyclerView 适配器 setOnClickListener

问题描述 投票:0回答:1

我是 Android Studio 的初学者,我有一些不明白的问题

因此,我从 RecyclerView 项目发起了从 MainActivity 到 DetailActivity 的 Intent,我想我已经完成了该步骤,但是当我构建应用程序并尝试单击该项目时,它不会将我带到 DetailActivity,这是我的代码

MainActivity.kt

package com.zireha.submission2.yuai.main

import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.zireha.submission2.data.response.UserItem
import com.zireha.submission2.databinding.ActivityMainBinding
import com.zireha.submission2.yuai.ditel.DetailActivity


class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var adapter: UserListAdapter

    @SuppressLint("NotifyDataSetChanged")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val mainViewModel = ViewModelProvider(
            this, ViewModelProvider.NewInstanceFactory()
        )[MainViewModel::class.java]

        adapter = UserListAdapter()


        binding.apply {
            rvItem.layoutManager = LinearLayoutManager(this@MainActivity)
            rvItem.setHasFixedSize(true)
            rvItem.adapter = adapter

            with(binding) {
                searchView.setupWithSearchBar(searchBar)
                searchView.editText.setOnEditorActionListener { _, _, _ ->
                    searchBar.text = searchView.text
                    searchView.hide()
                    mainViewModel.findUser(searchBar.text.toString())
                    false
                }

            }
            adapter.notifyDataSetChanged()
            adapter.setOnItemClickCallback(object: UserListAdapter.OnItemClickCallback {
                override fun onItemClick(item: UserItem) {
                    val intent = Intent(this@MainActivity, DetailActivity::class.java).also {
                        it.putExtra(DetailActivity.UNAMEEXTRA, item.login)
                    }

                    Log.d("MainActivity", "Intent: $intent")
                    startActivity(intent)
                }
            })
        }
        supportActionBar?.hide()

        val layoutManager = LinearLayoutManager(this)
        binding.rvItem.layoutManager = layoutManager
        val itemDecoration = DividerItemDecoration(this, layoutManager.orientation)
        binding.rvItem.addItemDecoration(itemDecoration)

        mainViewModel.listUser.observe(this) { userItem ->
            setUserData(userItem)
        }

        mainViewModel.isLoading.observe(this) {
            showLoading(it)
        }

        mainViewModel.snackbarText.observe(this) {
            Snackbar.make(window.decorView.rootView, it, Snackbar.LENGTH_SHORT).show()
        }

    }


    private fun setUserData(item: List<UserItem>) {
        val adapter = UserListAdapter()
        adapter.submitList(item)
        binding.rvItem.adapter = adapter
    }

    private fun showLoading(isLoading: Boolean) {
        binding.progressBar.visibility = if (isLoading) View.VISIBLE else View.GONE
    }

    companion object {
        val DIFF_CALLBACK = object : DiffUtil.ItemCallback<UserItem>() {
            override fun areItemsTheSame(oldItem: UserItem, newItem: UserItem): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: UserItem, newItem: UserItem): Boolean {
                return oldItem == newItem
            }
        }
    }

}

用户列表适配器.kt

package com.zireha.submission2.yuai.main

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.zireha.submission2.data.response.UserItem
import com.zireha.submission2.databinding.ItemUserRowBinding

class UserListAdapter : ListAdapter<UserItem, UserListAdapter.ViewHolder>(DIFF_CALLBACK) {

    private var onItemClickCallback: OnItemClickCallback? = null
    fun setOnItemClickCallback(onItemClickCallback: OnItemClickCallback) {
        this.onItemClickCallback = onItemClickCallback
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemUserRowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = getItem(position)
        holder.bind(item)
    }
    inner class ViewHolder(val binding: ItemUserRowBinding) : RecyclerView.ViewHolder(binding.root) {
        fun bind(item: UserItem) {
            binding.root.setOnClickListener {
                onItemClickCallback?.onItemClick(item)
            }
            binding.apply {
                Glide.with(itemView).load(item.avatarUrl)
                    .transition(DrawableTransitionOptions.withCrossFade()).centerCrop()
                    .into(ivAvatar)

                tvUsername.text = item.login
            }

        }
    }

    interface OnItemClickCallback{
        fun onItemClick(item: UserItem)
    }

    companion object {
        val DIFF_CALLBACK = object : DiffUtil.ItemCallback<UserItem>() {
            override fun areItemsTheSame(oldItem: UserItem, newItem: UserItem): Boolean {
                return oldItem == newItem
            }

            override fun areContentsTheSame(oldItem: UserItem, newItem: UserItem): Boolean {
                return oldItem == newItem
            }
        }
    }

}

详细活动.kt

package com.zireha.submission2.yuai.ditel

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
import com.zireha.submission2.databinding.ActivityDitelBinding

class DetailActivity : AppCompatActivity() {
    private lateinit var binding: ActivityDitelBinding
    private lateinit var viewDetailModel: DetailViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityDitelBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val uname = intent.getStringExtra(UNAMEEXTRA)
        val bundle = Bundle()
        bundle.putString(UNAMEEXTRA, uname)

        showLoading(true)
        viewDetailModel = ViewModelProvider(this).get(DetailViewModel::class.java)

        viewDetailModel.setDetail(uname.toString())
        viewDetailModel.getDetail().observe(this){
            if (it!=null){
                binding.apply {
                    showLoading(false)
                    tvNameDetail.text = it.name
                    tvUnameDetail.text = it.login
                    tvFollowingCount.text = it.following.toString()
                    tvFollowerCount.text = it.followers.toString()
                    Glide.with(this@DetailActivity).load(it.avatarUrl).transition(
                        DrawableTransitionOptions.withCrossFade()).circleCrop()
                        .into(ivAvaDetail)
                }
            }
        }

    }

    private fun showLoading(isLoading: Boolean) {
        binding.pBarDetail.visibility = if (isLoading) View.VISIBLE else View.GONE
    }

    companion object {
        const val UNAMEEXTRA = "extra_username"
    }
}

我尝试过移动这个

adapter.setOnItemClickCallback(object: UserListAdapter.OnItemClickCallback {
                override fun onItemClick(item: UserItem) {
                    val intent = Intent(this@MainActivity, DetailActivity::class.java).also {
                        it.putExtra(DetailActivity.UNAMEEXTRA, item.login)
                    }

                    Log.d("MainActivity", "Intent: $intent")
                    startActivity(intent)
                }
            })

binding.apply{}
之外和
with(binding){}
之外,当我单击该项目时,它会发出反馈声音,但不会发出意图操作。我还尝试将
onItemClickCallback
重新声明为非私有,但这会导致强制关闭。我还检查了清单中的 DetailActivity 并在其中声明了它

android kotlin android-intent
1个回答
0
投票

结果解决方案是将 Intent 内部移动到 fun 绑定函数中,所以它会像:

fun bind(item: UserItem) {
        binding.root.setOnClickListener {
            val intent = Intent(binding.root.context, DetailActivity::class.java)
            intent.putExtra(DetailActivity.UNAMEEXTRA, item.login)
            intent.putExtra(DetailActivity.IDEXTRA, item.id)
            intent.putExtra(DetailActivity.URLEXTRA, item.avatarUrl)
            binding.root.context.startActivity(intent)
        }
        binding.apply {
            Glide.with(itemView).load(item.avatarUrl)
                .transition(DrawableTransitionOptions.withCrossFade()).centerCrop()
                .into(ivAvatar)

            tvUsername.text = item.login
        }
© www.soinside.com 2019 - 2024. All rights reserved.