android-fragments 如何在Kotlin中单击Recycler视图打开“Details”片段

qaxu7uf2  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(167)

我有一个home片段,我想让它转到另一个显示其“详细信息”的片段,该片段将所单击的recyclerview项的数据传递给该“详细信息”片段。

当我点击文章,它会移动到详细文章,通过数据。
至于代码,下面是适配器:

class ArticleAdapter(private val articleList: ArrayList<Article>) :
    RecyclerView.Adapter<ArticleAdapter.MyViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val binding = ItemArticleBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return MyViewHolder(binding)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val data = articleList[position]
        holder.bind(data)
    }

    class MyViewHolder(private val binding: ItemArticleBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(data: Article) {
            Glide.with(binding.root.context)
                .load(data.img)
                .into(binding.articleImage)
            binding.articleTitle.text = data.title

            binding.root.setOnClickListener {
                val article = Article(
                    data.title,
                    data.img,
                    data.content
                )
            }
        }
    }

    override fun getItemCount(): Int {
        return articleList.size
    }
}

这是我的详细信息片段

class DetailArticleFragment : Fragment() {
    private var _binding: FragmentDetailArticleBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentDetailArticleBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val intent = Intent(binding.root.context, DetailArticleFragment::class.java)
        val article = intent.getParcelableExtra<Article>(DETAIL_ARTICLE) as Article
        Glide.with(this)
            .load(article.img)
            .into(_binding!!.articleImage)
        _binding!!.articleTitle.text = article.title
        _binding!!.articleDescription.text = article.content
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
    companion object {
        const val DETAIL_ARTICLE = "detail_article"
    }
}
k7fdbhmy

k7fdbhmy1#

您需要将click listener接口传递给适配器,例如:

typealias OnArticleClick = (article: Article) -> Unit

class ArticleAdapter(
    private val articleList: ArrayList<Article>
) :
    RecyclerView.Adapter<ArticleAdapter.MyViewHolder>() {
    var onArticleClick: OnArticleClick? = null
    ...
            binding.root.setOnClickListener {
                val article = Article(
                    data.title,
                    data.img,
                    data.content
                )
                onArticleClick?.invoke(article)
            }
    ...
}

并使用RecyclerView在您的主页片段中初始化文章单击:

adapter.apply {
    onArticleClick = {
        // show details fragment
    }
}

相关问题