Добавление данных в существующую строку в новом столбце для TableLayout - Kotlin - PullRequest
0 голосов
/ 23 октября 2018

Так что у меня есть этот интерфейс, где я добавляю новые элементы в TableLayout при нажатии кнопки. См. Это изображение

Проблема, как вы видите на рисунке выше, состоит в том, что вместо добавления новых элементов в верхней части третьего столбца он добавляет его в качестве новой строки втретий столбец.Таким образом, новые элементы должны добавлять линейные значения ко второму столбцу в третьем столбце, если размер списка больше 5. Я могу решить эту проблему только путем добавления новых строк.Я не знаю, как решить это хорошим способом.

Вот код

fun addPlayerToTable(player: String) {

    //Create new Row and TextView
    val newRow = TableRow(this)
    val newText = TextView(this)

    var layoutParams = TableRow.LayoutParams(
        TableRow.LayoutParams.WRAP_CONTENT,
        TableRow.LayoutParams.WRAP_CONTENT)
    //Set text on ViewText
    newText.text = player

    if(players.size > 5){

        layoutParams.column = 2

    }else {
        layoutParams.column = 1
    }

    //Add TextViews and Rows dynamically
    newRow.addView(newText, layoutParams)
    table!!.addView(newRow)

}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Так что я на самом деле решил это.Исправление было добавление новых TextViews и TableRows в некоторых условиях.А также удалите представления из индекса 1-6, так как мы не хотим удалять индекс 0.Возможно, это можно сделать намного проще.

 fun addPlayerToTable(player: String) {

    //Create new Row and TextView
    var newRow = TableRow(this)
    var newText = TextView(this)
    var list = mutableListOf<TableRow>()
    var texts = mutableListOf<TextView>()

    if(players.size > 5){

        for(i in 0 until players.size){
            list.add(TableRow(this))
            texts.add(TextView(this))
            texts[i].text = players[i]
        }
    }

    var layoutParams = TableRow.LayoutParams(
        TableRow.LayoutParams.WRAP_CONTENT,
        TableRow.LayoutParams.WRAP_CONTENT)
    layoutParams.column = 1
    //Set text on ViewText
    newText.text = player

    if(players.size > 5){

        for(i in 1 until 6){
            table!!.removeViewAt(1)

        }
        for(i in 0 until 5){
            if(i + 5 >= players.size){
                list[i].addView(texts[i], layoutParams)
                table!!.addView(list[i])
            }
            else{
                list[i].addView(texts[i], layoutParams)
                list[i].addView(texts[i+5], layoutParams)
                table!!.addView(list[i])
            }

        }

    }else {

        //Add TextViews and Rows dynamically
        newRow.addView(newText, layoutParams)
        table!!.addView(newRow)
    }

}
0 голосов
/ 23 октября 2018

https://developer.android.com/reference/android/widget/TableLayout

После ссылки на этот документ я вижу, что вы можете явно установить индекс при использовании метода "addView".

Используйте оператор if перед добавлением представления для проверкиесли layoutParams.column == 2, если это так, чем установить значение индекса addView для Players.size - 5.

РЕДАКТИРОВАТЬ: если вы надеетесь получить новый столбец для каждых 5 игроков, чемпеременная, установленная на 5, умноженная на количество столбцов и использующая ее для вычитания из player.size.

т.е.Players.size равен 20, следующий добавленный игрок начнет столбец № 5.Чтобы поместить этого игрока в строку 1 или индекс 0, вам нужно будет вычесть 20 из Players.size, если вы умножите 5 на количество столбцов и вычтете 5 после этого, вы легко добьетесь этого результата.

...