Почему мой foreach ломается, когда я пытаюсь рисовать динамические кнопки в Kotlin? - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно рисовать динамические кнопки внутри цикла foreach, которые извлекают данные из моего anko sqlite, при этом foreach вводится только один раз, прерывается и рисует только одну кнопку в моем макете, что я делаю неправильно?мой код таков:

fun loadZones (ctx: Context, update: String, view: View, layout: LinearLayout) {
    val zonesParser = rowParser{idzone: Int, zone: String -> Pair(idzone, zone)}
    for (it in ctx.database.use {
        select("tableplan")
            .distinct()
            .column("idzone")
            .column("zone")
            .orderBy("zone")
            .parseList(zonesParser)
    }) {
        val layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
        val btnZone = layoutInflater.inflate(R.layout.zones_item, null) as MaterialButton
        btnZone.text = it.second
        btnZone.id = it.first
        layout.addView(btnZone, layoutParams)
        Log.e("PAIR", "FIN DEL CICLO")
        continue
    }
}

Данные, полученные из моего запроса, таковы:

(2, LARRY)
(1, MADISON)

Это моя деятельность, мне нужно нарисовать кнопки в "lytZonesButtons" id

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent" tools:context=".TablePlanFragment">
    <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent"
                                                     android:layout_height="wrap_content" android:elevation="2dp"
                                                     tools:targetApi="lollipop" app:liftOnScroll="true">
        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbarTablePlan"
                style="@style/com.madison.Toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:title="@string/table_title_module">
        </androidx.appcompat.widget.Toolbar>
    </com.google.android.material.appbar.AppBarLayout>
    <LinearLayout
            android:layout_marginTop="56dp"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:orientation="horizontal"
            android:background="@color/orangeLighter"
            android:gravity="center_vertical"
            android:padding="5dp" android:id="@+id/lytZonesButtons" />
    <androidx.core.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="112dp"
            android:padding="5dp">
        <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rc_tableplan"
                android:layout_width="match_parent"
                android:layout_height="match_parent"

        />
    </androidx.core.widget.NestedScrollView>
</FrameLayout>

и это мой шаблон кнопки, который я назвал "zone_item":

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.button.MaterialButton
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" style="@style/com.madison.AppButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle2"
        tools:text="MADISON"
        tools:targetApi="lollipop"
        android:layout_margin="5dp"
/>

EDIT : я нашел решение!

Теперь я не знаю, почему мой экземпляр макета в двухкратной итерации моего цикла выдает NullPointerException, но не отображается в log cat, мое решение было поместить код цикла в функцию onCreateView, это код:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.activity_tableplan, container, false)
        val iActivity = (activity as AppCompatActivity)
        iActivity.setSupportActionBar(view.toolbarTablePlan)
        iActivity.supportActionBar?.setDisplayShowTitleEnabled(true)
        // view.rc_tableplan.setHasFixedSize(true)
        // val gridLayoutManager = GridLayoutManager(context, 2, GridLayoutManager.HORIZONTAL, false)
        // view.rc_tableplan.layoutManager = gridLayoutManager
        val response = loadTablePlan(this.context!!, "no")
        if (response.trim().toUpperCase() == "SUCCESS") {
            val zonesParser = rowParser{idzone: Int, zone: String -> Pair(idzone, zone)}
            for (zone in this.context!!.database.use {
                select("tableplan")
                    .distinct()
                    .column("idzone")
                    .column("zone")
                    .orderBy("zone")
                    .parseList(zonesParser)
            }) {
                val layout:LinearLayout = view.lytZonesButtons
                layout.let {
                    val btnZone = layoutInflater.inflate(R.layout.zones_item, layout, false) as MaterialButton
                    btnZone.text = zone.second
                    btnZone.id = zone.first
                    btnZone.requestLayout()
                    layout.addView(btnZone)
                    Log.e("PAIR", "FIN DEL CICLO")
                }
            }
        }
        return view
    }

Большое спасибо всем, кто пытался помочь мне, некоторые администраторы могут закрыть мой вопрос, пожалуйста.

1 Ответ

0 голосов
/ 20 февраля 2019

Подсказка показывает только одну кнопку.Вы пытаетесь раздувать одно и то же представление дважды в одном и том же месте.

Вам необходимо добавить пустую линейную форму в ваш xml.И в вашем цикле измените buttonz.

var btnZone = findViewById(R.layout.btnZone) 
button.text = "Pair"
btnZone.addView(button, layoutParams)

Это не точный код (и, возможно, даже не правильный синтаксис), но он показывает, как вам нужно изменить цикл.

В основном вы пытались раздувать один и тот же экземпляр того же представления.Если на самом деле вы не раздуваете какие-либо представления таким образом, вы просто добавляете представления.

Примечание Если у вас есть линейный макет в вашем XML, когда вы добавляете в него другой вид кнопки, он добавит его под ним.Если вы установите горизонтальную ориентацию макета, вид кнопки будет добавлен к другому.

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

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