如何打开“详细信息” Kotlin的Recyclerview的片段

发布于 2025-02-06 18:23:07 字数 2618 浏览 1 评论 0原文

我有家庭碎片,我希望它转到另一个片段,该片段将显示其“详细信息”,该片段将单击的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"
    }
}

I have home fragment and I want it to go to another fragment which will show its "details", which passes the data of the clicked recyclerview item to that "details" fragment.

enter image description here

When I click the article it will move to detail article which passes the data.

As for the code, here's the adapter:

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

Here's my detailFragment

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"
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失而复得 2025-02-13 18:23:07

您需要将单击侦听器接口传递到适配器,例如:

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在房屋中init onarticleclick:

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

You need to pass click listener interface to adapter, for example:

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)
            }
    ...
}

And init onArticleClick in your home fragment with RecyclerView:

adapter.apply {
    onArticleClick = {
        // show details fragment
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文