改变另一个片段的片段(列表)

Posted

技术标签:

【中文标题】改变另一个片段的片段(列表)【英文标题】:A fragment (list) that changes another fragment 【发布时间】:2019-09-06 22:51:36 【问题描述】:

两个片段作为一种菜单一起工作;顶部片段应包含由底部片段内的列表更改的 ImageView。我该怎么做呢?我需要使用 RecyclerView 吗?

我不确定从哪里开始,我是否必须制作一个通用片段或为每个列表项制作一个片段。如果我可以选择通用选项;我将如何去做这样的事情?任何帮助将不胜感激我真的迷路了。

How it is supposed to look like

【问题讨论】:

您的想法对我来说听起来不错 - 您不需要使用两个 Fragment,只需一个即可,但您可以,这样做可能会在未来为您提供更大的灵活性。 RecyclerView 也可以。 【参考方案1】:

推理

你可以选择任何一个。

因此,基本上,您可以编写任何布局文件,并且可以将其扩展为 FragmentActivity 或就像 RecyclerView.ViewHolder 一样,从那个角度来看,这并不重要(布局文件)。

片段是一个不错的选择,因为:

它们允许轻松重用包含Fragment 的所有代码 它们是可实例化的,不像Activity;这基本上意味着您不必通过Parcelable模式的实现来在它们之间传递复杂的对象(片段片段||片段活动)

Activity 就足够了:

实现一个 Fragment 真的很好,但如果你只是不需要它,那么你正在编写没有任何实际用途的样板代码......所以不要这样做:P

示例代码

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_
        android:layout_
        tools:context=".***Sample">

    <ImageView
            android:id="@+id/your_image_view"
            android:src="@drawable/ic_launcher_foreground"
            android:layout_
            android:layout_
            app:layout_constraintTop_toTopOf="parent"/>

    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_
            android:layout_
            app:layout_constraintTop_toBottomOf="@+id/your_image_view"
            app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Kotlin 代码:

class ***Sample : AppCompatActivity() 


    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_stack_overflow_sample)
        recycler.apply 
            adapter = SwitcherAdapter(
                arrayOf(
                    Data("F", R.drawable.froyo, ::onItemClicked),
                    Data("O", R.drawable.oreo, ::onItemClicked)
                )
            )
            layoutManager = LinearLayoutManager(this@***Sample)
        
    

    fun onItemClicked(data: Data) 
        your_image_view.setImageResource(data.resourceDrawable)
    



data class Data(val textViewText: String, val resourceDrawable: Int, val callback: ((Data) -> Unit)? = null)

class SwitcherAdapter(val dataset: Array<Data>) : RecyclerView.Adapter<SimpleViewHolder>() 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleViewHolder 
        val view = LayoutInflater.from(parent.context).inflate(R.layout.simple_viewholder_item, parent, false)
        return SimpleViewHolder(view)
    
    override fun getItemCount(): Int = dataset.size
    override fun onBindViewHolder(holder: SimpleViewHolder, position: Int) = holder.bindTo(dataset[position])


class SimpleViewHolder(view: View) : RecyclerView.ViewHolder(view) 

    val textView= view.findViewById<TextView>(R.id.text)

    fun bindTo(data: Data) 
        data.callback?.let  call ->
            super.itemView.setOnClickListener  call.invoke(data) 
        
        textView.text = data.textViewText
    

【讨论】:

哇,谢谢,这非常详细和有帮助,解决了我脑海中的很多问题。实际上我确实必须使用片段,这是为了分配,否则我显然不会打扰。我目前不在 PC 附近,但是当我回到家时,我会尝试解决这个问题并使用片段来完成此操作 如果您需要有关将托管您的 Fragments 的 Activity 的一些指导,请告诉我 :) 我现在遇到了一个未初始化的 lateint 变量的问题 :( 有什么地方我可以联系你看一下,这样我们就不会绕过这个线程? 请随时通过 miquelrc95@outlook.es 给我发电子邮件【参考方案2】:

我肯定会使用 RecyclerView 作为列表。

至于顶部,如果您只是替换图像,我建议您只在主要活动上使用 ImageView。

然后在您的 RecyclerView 适配器中设置一个接口,将所选对象传递给您的片段,然后返回您的活动。然后在该回调中,更新 ImageView。

【讨论】:

【参考方案3】:

使用观察者模式。

当您单击底部 Fragment 的 RecyclerView 的某个项目时,通知所有订阅者并选择新的值。然后,在 Activity 上将顶部 Fragment 设置为订阅者,最后,在顶部 Fragment 的回调中,您在 ImageView 中进行更改。

是的,强烈建议您使用 RecyclerView 将项目作为列表处理。

PS.:如果您想在其他活动中使用具有相同行为的 RecyclerView 或 ImageView,则只需要使用片段,否则将它们直接放在活动中是完全可以的。

【讨论】:

以上是关于改变另一个片段的片段(列表)的主要内容,如果未能解决你的问题,请参考以下文章

从另一个片段中的目录更新片段中的列表视图元素

如何将列表视图中的数据从一个片段发送到另一个片段

无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图

是否可以将一个对象从一个片段发送到另一个片段?

从另一个活动返回后如何恢复活动中最后打开的片段

如何从使用视图寻呼机创建的选项卡片段转移到另一个片段