[RESOLVIDO] ANDROID - Adicionar elementos à tela dinamicamente durante um looping

5 respostas
eliangela

Olá, pessoal!

Estou fazendo um programa para Android e eu preciso listar um certo conteúdo na tela durante um looping. O problema é que são várias linhas e eu queria adicioná-las aos poucos pra não parecer que está lento, mas o Android somente chama o método invalidade() no final do looping.

Segue meu código:

Handler handler = new Handler();
for (Produto produto : listProdutos) {
	TableRow itemRow = new TableRow(PedidoListaFrame.this);
	TextView descricao = new TextView(this);
	descricao.setText(produto.toString());
	itemRow.addView(descricao);

	itemRow.addView(new EditText(this), rowLayoutParams);

	tableLayout.addView(itemRow);

	if (++cont % 10 == 0) {
		handler.postDelayed(new Runnable() {

			public void run() {
				subcategoriasLayout.invalidate();
			}
		}, 10);
	}
}
subcategoriasLayout.addView(tableLayout);
subcategoriasLayout.invalidate();

Obrigada

5 Respostas

Marky.Vasconcelos

O componente só vai executar o invalidate quando a UI Thread estiver ociosa (depois que ele terminar seu metodo).

Voce precisa fazer o processamento em outra Thread, mas dai vem o incoveniente que as Views precisam ser criadas no Runnable que rodará no Handler.

eliangela

Marky.Vasconcelos:
O componente só vai executar o invalidate quando a UI Thread estiver ociosa (depois que ele terminar seu metodo).

Voce precisa fazer o processamento em outra Thread, mas dai vem o incoveniente que as Views precisam ser criadas no Runnable que rodará no Handler.

Eu já fiz tanta coisa aqui, que eu não estou conseguindo pensar em como fazer isso. Dá um exemplo, por fv.

Obrigada

Marky.Vasconcelos

Algo assim:

Handler handler = new Handler();
for (Produto produto : listProdutos) {
		handler.postDelayed(new Runnable() {

			public void run() {
	TableRow itemRow = new TableRow(PedidoListaFrame.this);
	TextView descricao = new TextView(this);
	descricao.setText(produto.toString());
	itemRow.addView(descricao);

	itemRow.addView(new EditText(this), rowLayoutParams);

	tableLayout.addView(itemRow);
			}
		}, ++cont * 10);
}
subcategoriasLayout.addView(tableLayout);
subcategoriasLayout.invalidate();
eliangela

Olá Marky!

Não consegui resolver da maneira que vc disse, mas consegui usando AsyncTask:
http://www.guj.com.br/java/263166-resolvidoreceber-string-via-socket
http://stackoverflow.com/questions/8953308/android-add-elements-to-screen-dynamically-during-a-loop/
http://developer.android.com/reference/android/os/AsyncTask.html

Obrigada

Marky.Vasconcelos

O que eu postei não faz muito sentido mesmo.

O ideal é realizar esses processos em uma Thread (ASyncTask por exemplo) e sincronizar com a UI via Handler.

Criado 20 de janeiro de 2012
Ultima resposta 23 de jan. de 2012
Respostas 5
Participantes 2