当我尝试在Kotlin中绘制动态按钮时,为什么我的foreach会中断?

时间:2019-02-20 01:08:35

标签: android kotlin

我需要在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>

这就是我称为“ zones_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"
/>

编辑:我找到了解决方法!

我现在不为什么在两次循环迭代中我的布局实例会抛出NullPointerException但在日志猫中却没有显示,我的解决方案是将循环代码放入onCreateView函数中,这是代码: / p>

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 :(得分:1)

提示仅显示一个按钮。您试图在同一位置两次放大同一视图。

您需要在xml中添加一个空的linearlayout。然后在循环中更改buttonz。

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

这不是确切的代码(甚至可能不是正确的语法),但是它向您展示了如何修改循环。

基本上,您试图为同一视图的同一实例充气。当您确实不以这种方式夸大任何视图时,您只需添加视图即可。

注意 如果在xml中添加线性布局时向其添加另一个按钮视图,则会将其添加到其下方。如果将布局方向设置为水平,则按钮视图将添加到另一个视图的旁边。

这是一个示例链接。 抱歉,请确保我的代码使用正确的语法匹配您的代码和变量,但是我在工作。