两个片段,它们作为一种菜单一起工作;顶部片段应该包含一个 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,则只需要使用片段,否则完全可以将它们保持在活动中。