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



两个片段,它们作为一种菜单一起工作;顶部片段应该包含一个 ImageView,该 ImageView 由底部片段内的列表更改。我该怎么做?我需要使用回收器视图吗?

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

它应该是什么样子

推理

你可以选择任何一个。

所以基本上,你可以写任何布局文件,你可以把它膨胀在一个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_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".StackOverflowSample">
    <ImageView
            android:id="@+id/your_image_view"
            android:src="@drawable/ic_launcher_foreground"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            app:layout_constraintTop_toTopOf="parent"/>
    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintTop_toBottomOf="@+id/your_image_view"
            app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Kotlin 代码:

class StackOverflowSample : 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@StackOverflowSample)
        }
    }
    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
    }
}

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

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

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

使用观察者模式。

单击底部片段的回收器视图的某个项目时,使用所选的新值通知所有订阅者。然后,在活动上将顶部片段设置为订阅者,最后,在顶部片段的回调上,在 ImageView 中进行更改。

是的,强烈建议您使用回收器视图将项目作为列表处理。

PS.:如果您想在其他活动中使用相同的行为来使用该RecyclerView或ImageView,则只需要使用片段,否则完全可以将它们保持在活动中。

最新更新