[BUG] ListView -> Evento de Click no Item

Alguém sabe porque quando eu clico no ListView para scrollar, eu não consigo mais selecionar nenhum item do ListView??

Segue código:

Adapter:

package br.com.i2mobile.Adapters;

import br.com.i2mobile.IGmail.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class AnexarAdapter extends BaseAdapter {
	
	private Context ctx;
	private String[] arquivos;
	
	public AnexarAdapter(Context ctx, String[] arquivos){
		super();
		this.ctx = ctx;
		this.arquivos = arquivos;
	}
	
	public int getCount() {
		return arquivos.length;
	}

	public Object getItem(int position) {
		return arquivos[position];
	}

	public long getItemId(int position) {
		return position;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		
		LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View view = inflater.inflate(R.layout.item_escolher_pasta, null);
		
		TextView txt = (TextView) view.findViewById(R.id.txtNomePastas);
		txt.setText(arquivos[position]);
		
		notifyDataSetChanged();
		
		return view;
	}

}

Código de atualização: O mesmo está contido na minha Activity!

@Override
	protected Dialog onCreateDialog(int id) {
		
		switch (id) {
		case DIALOG_ANEXAR:
			Dialog dialogAnexar = new Dialog(EscreverEmailScreen.this);
			dialogAnexar.setContentView(R.layout.escolher_pasta);
			dialogAnexar.setTitle("Pastas e Arquivos");
			lv = (ListView) dialogAnexar.findViewById(R.pastas.listPastas);
			
			atualizar();
			
			dialog = dialogAnexar;
break;
}
return dialog;
}

private void atualizar() {
		File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + anexo);
		if(f.list().length > 0) {
			pastas = f.list();
		} else {
			pastas = null;
		}
		
		AnexarAdapter adapter = new AnexarAdapter(this, pastas){
			public long getItemId(int position) {
				return super.getItemId(position);
			}
		};
		
		lv.removeAllViewsInLayout();
		lv.setAdapter(adapter);
		
		lv.setOnItemClickListener(new OnItemClickListener() {
			
			public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
				anexoAux = pastas[position];
				if(anexoAux.indexOf(".") == anexoAux.length() - 4) {
					anexo = anexo + "/" + anexoAux;
					Toast.makeText(getBaseContext(), "Arquivo " + pastas[position] + " anexado com sucesso!", Toast.LENGTH_LONG).show();
					dialog.dismiss();
				} else {
					anexo = anexo + "/" + anexoAux;
					atualizar();
				}
			}
		});
	}

Alguém me ajuda? Já pesquisei muito e não consegui uma resposta descente!
Abraço,

Eu não entendi o que voce está fazendo com esse Dialog.

Oi Marky,
Usei um Dialog para navegação das pastas do SD CARD. Sacou?

Quando eu clico em um item ele atualiza o adapter e me mostra os itens da pasta de cliquei, se for um arquivo ele irá anexar e dar dismiss() no dialog.
Sacou? :slight_smile:

Alguma ajuda? Ou dica.

Olá,
Retira o notifyDataSetChanged() do adapter.

Também não entendi a sua rotina.
Acho que entendi o que voce está tentando fazer.
Voce esta inicializando a lista pastas toda vez. Não deveria estar adicionando os novos arquivos?

Na verdade, eu estou atualizando a lista de pastas ao clicar no item. Sacou?
Ta funcionando, mas tem esse bug não sei porque… :S

Entendi.
Testou sem o notifyDataSetChanged dentro do adapter? Não sei se tem algum efeito, mas ali não tem dados sendo alterados. (na pasta)
Quando voce scrolla entra em modo touch
Tentou usar uma tecla? deveria voltar a aceitar seleção.

Sugestao:
Separa o atualizar em dois metodos
no atualizar1:
igual atualizar atual menos as linhas 20-25
na linha 46 coloca atualizar2()

no atualizar2:
as linhas 20-25
lv.getAdapter().notifyDataSetChanged();

no onCreateDialog chama o atualizar1

implementa o onPrepareDialog e la chama o atualizar2

Testei o notifyDataSetChanged() dentro do adapter de um ListView simples e o resultado é igual ao que está ocorrendo com o seu programa.
então é só tirar ele de lá.

O notifiyDataSetChanged “avisa” pra listview que ela tem que se redesenhar porque os dados dela mudaram. Outro detalhe é que você não esta reutilizando a view. O ideal é vc só criar uma View nova com o LayoutInflater se o convertView for null. Caso contrário, vc pode trocar os dados do convertView. A idéia é que assim sua app vai ser mais eficiente no uso de memória (Imagina se vc tem 10000 ítens na lista).