Динамически добавлять фрагменты (или соответствующий компонент) в представление списка в Android App (Kotlin) - PullRequest
0 голосов
/ 05 февраля 2020

Я не уверен в теории развития Kotlin и Android (все еще новичок). У меня есть фрагмент с простым элементом хранения счета к нему. Он отображает счет и есть кнопка + & -, чтобы повлиять на счет. Ниже приведен фрагмент кода:

ScoreKeepingBasicFragment.kt

class ScoreKeepingBasicFragment : Fragment() {

    companion object {
        fun newInstance() =
            ScoreKeepingBasicFragment()
    }

    private lateinit var binding: ScoreKeepingBasicFragmentBinding
    private val viewModel by viewModels<ScoreKeepingBasicViewModel> {
        ScoreKeepingBasicViewModelFactory()
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = DataBindingUtil.inflate(
            inflater,
            R.layout.score_keeping_basic_fragment,
            container,
            false
        )
        binding.lifecycleOwner = this
        binding.viewModel = viewModel


        return binding.root
    }
}

ScoreKeepingBasicViewModel.kt

class ScoreKeepingBasicViewModelFactory : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return modelClass.getConstructor().newInstance()
    }
}

class ScoreKeepingBasicViewModel : ViewModel() {
    var scoreText = MutableLiveData<String>("0")
    private var scoreInt: Int = 0


    fun addScore(){
        println("ADD")
        scoreInt++
        scoreText.value = "$scoreInt"
    }

    fun minusScore(){
        println("Minus")
        scoreInt--
        scoreText.value = "$scoreInt"
    }
}

score_keeping_basic_fragment. xml

<layout>
    <data>
        <variable
            name="viewModel"
            type="com.michaelcodesthings.scorekeeper.viewmodel.ScoreKeepingBasicViewModel" />
    </data>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:gravity="center"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/minus_layout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:onClick="@{()->viewModel.minusScore()}">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_margin="8dp"
                android:background="@drawable/left_rectangle"
                android:src="@drawable/ic_remove"/>
        </LinearLayout>
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:orientation="horizontal">
            <TextView
                android:id="@+id/score_list_item"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginVertical="8dp"
                android:background="@drawable/center_rectangle"
                android:gravity="center"
                android:text="@{viewModel.scoreText}"
                android:textAlignment="center"
                android:textSize="30sp" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/add_layout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:onClick="@{()->viewModel.addScore()}">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/right_rectangle"
                android:src="@drawable/ic_add"
                android:layout_margin="8dp"/>
        </LinearLayout>
    </LinearLayout>
</layout>

Теперь этот фрагмент работает именно так, как я хочу, добавляя и убирая из оценки. И отлично работает, если бы я использовал тег «include» в другом фрагменте или деятельности.

Но теперь я заблудился о том, как работает Kotlin / Android Dev. Я хочу иметь список этих фрагментов на экране, пользователь может нажать кнопку «Добавить оценку», и еще один из них будет добавлен в список, поэтому будет динамически добавлять оценки в представление списка. Каждый элемент в списке нуждается в своем собственном состоянии и работает независимо от остальных. Ниже приведена диаграмма примерно того, как я хочу, чтобы она выглядела.

Я провел некоторый поиск, но читал, что вы не можете добавлять фрагменты в представления списка, но, похоже, не нашли решения для моего проблема. Любые идеи о том, как решить эту проблему?

Любая помощь в том, как работает лог c, будет принята с благодарностью. Заранее благодарим за любую помощь.

Diagram on roughly how I want it to look

Score Fragment

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...