改变另一个片段的片段(列表)
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】:
推理
你可以选择任何一个。
因此,基本上,您可以编写任何布局文件,并且可以将其扩展为 Fragment
、Activity
或就像 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 附近,但是当我回到家时,我会尝试解决这个问题并使用片段来完成此操作 如果您需要有关将托管您的Fragment
s 的 Activity
的一些指导,请告诉我 :)
我现在遇到了一个未初始化的 lateint 变量的问题 :( 有什么地方我可以联系你看一下,这样我们就不会绕过这个线程?
请随时通过 miquelrc95@outlook.es 给我发电子邮件【参考方案2】:
我肯定会使用 RecyclerView 作为列表。
至于顶部,如果您只是替换图像,我建议您只在主要活动上使用 ImageView。
然后在您的 RecyclerView 适配器中设置一个接口,将所选对象传递给您的片段,然后返回您的活动。然后在该回调中,更新 ImageView。
【讨论】:
【参考方案3】:使用观察者模式。
当您单击底部 Fragment 的 RecyclerView 的某个项目时,通知所有订阅者并选择新的值。然后,在 Activity 上将顶部 Fragment 设置为订阅者,最后,在顶部 Fragment 的回调中,您在 ImageView 中进行更改。
是的,强烈建议您使用 RecyclerView 将项目作为列表处理。
PS.:如果您想在其他活动中使用具有相同行为的 RecyclerView 或 ImageView,则只需要使用片段,否则将它们直接放在活动中是完全可以的。
【讨论】:
以上是关于改变另一个片段的片段(列表)的主要内容,如果未能解决你的问题,请参考以下文章