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

5 respostas
E

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

M

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.

E

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

M

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();
E

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

M

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