Здесь:
for(int i = 0; i<list_apps.size(); i++)
{
html+="<td>"+list_apps.get(0).toString() +"</td>";//username
html+="<td>"+list_apps.get(1).toString() +"</td>";//appname
html+="<td>"+list_apps.get(2).toString() +"</td>";//ip
html+="<td>"+list_apps.get(3).toString() +"</td>";//token
html+="<tr>";
}
Что вы на самом деле сделали: добавив свои «строки» с 4 столбцами в ваш список.
Итак, вы хотите, чтобы ваш цикл for работал в «чанках» из 4 элементов, например:
for(int i = 0; i<list_apps.size(); i+=4)
{
html+="<td>"+list_apps.get(i).toString() +"</td>";//username
html+="<td>"+list_apps.get(i+1).toString() +"</td>";//appname
html+="<td>"+list_apps.get(i+2).toString() +"</td>";//ip
html+="<td>"+list_apps.get(i+3).toString() +"</td>";//token
html+="<tr>";
}
Кроме того, «реальным» ответом будет: создать класс, который представляет эти данные, например, наличие полей-членов username, appname, ip, token. Затем создайте один объект для каждой строки и добавьте этот единственный объект в свой список. Затем повторите этот список и просто печатайте один объект за раз!
Ваш подход заключается в том, чтобы "развернуть" все ваши данные в единый список, и это, как правило, не очень хорошая идея.