Фрагмент (список), который изменяет другой фрагмент - PullRequest
0 голосов
/ 16 апреля 2019

Два фрагмента, которые работают вместе как своего рода меню;верхний фрагмент должен содержать ImageView, который изменяется списком, который находится внутри нижнего фрагмента.Как мне это сделать?Нужно ли мне использовать RecyclerView?

Я не уверен, с чего начать, должен ли я сделать общий фрагмент или создать фрагмент для каждого элемента списка.Если я могу пойти с универсальным вариантом;как бы я поступил так?Буду признателен за любую помощь, я действительно потерян.

Как это должно выглядеть

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Я бы точно использовал RecyclerView для списка.

Что касается верхней части, если вы просто заменяете изображение, я бы порекомендовал просто использовать ImageView на основной деятельности.

Затем настройте интерфейс в вашем адаптере RecyclerView, который передает выбранный объект вашему фрагменту, а затем возвращается к вашей деятельности. Затем в этом обратном вызове обновите ImageView.

0 голосов
/ 16 апреля 2019

Обоснование

Вы можете пойти с любым из них.

Таким образом, вы можете написать любой файл макета, и вы сможете раздувать его либо в Fragment, либо * 1006.* или просто как RecyclerView.ViewHolder это не имеет значения с этой точки зрения (файл макета).

Фрагменты - отличный выбор, потому что:

  • Они позволяют легкоповторное использование всего кода, включающего Fragment
  • Они могут быть созданы в отличие от Activity;что в основном означает, что вам не нужно проходить через реализацию Parcelable скороговорки, чтобы передавать сложные объекты между ними (Fragment <-> Fragment || Fragment <-> Activity)

Достаточно было бы Activity:

Реализация фрагмента действительно хороша, но если вам это просто не нужно, то вы пишете шаблонный код, который не предназначен для реального использования ...не делайте этого: 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>

Код Котлина:

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
    }
}
0 голосов
/ 16 апреля 2019

Используйте шаблон Observer.

Когда вы щелкаете элемент RecyclerView вашего нижнего фрагмента, уведомите всех подписчиков о выбранном новом значении.Затем в задании вы устанавливаете верхний фрагмент в качестве подписчика и, наконец, в ответном вызове верхнего фрагмента вносите изменения в ImageView.

И да, настоятельно рекомендуется использовать RecyclerView для обработкиэлементы в виде списка.

PS .: вам нужно будет использовать фрагменты только в том случае, если вы хотите использовать либо RecyclerView, либо этот ImageView с таким же поведением в других действиях, в противном случае совершенно нормально держать их прямо вактивность.

...