Estou carregando um EditText em uma ListView, até ai tudo bem.
Quando digito alguma coisa nesse EditText e rolo a ListView, o valor digitado no EditText vai para outra posição da ListView.
Quando o getView é chamado, ele pode retornar para voce uma View no “convertView”, essa é uma View que já está no Layout mas está fora da area de scrollagem, então o Adapter o reaproveita para exibir um novo item.
Voce tem que sempre limpar setar estado da View no getView.
Como assim, limpar setar estado da View no getView?
Marky.Vasconcelos
Voce tem que sempre limpar o estado da View e setar o novo pelo getView.
M
matheusms
Pode me dar um exemplo?
wagnerfrancisco
O currentView reaproveita uma View previamente utilizada por questões de performance. Portanto se você tinha um determinado valor naquela View, ao rolar a lista a View será reaproveitada e caso você não a limpe os valores antigos estarão lá. No seu código você já faz:
holder.img.setImageResource(sapato.getImagem());
Mas repare que em momento algum você limpa/reatribui algum valor ao seu EditText. Ficaria algo assim:
public View getView(final int position, View convertView, ViewGroup parent){
final Sapatos sapato = lista.get(position);
if (convertView == null){
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_pedidos, null);
holder.img = (ImageView) convertView.findViewById(R.id.imgPed);
holder.edt = (EditText)convertView.findViewById(R.id.editText1);
final LinearLayout layout;
layout = (LinearLayout)convertView.findViewById(R.id.LayoutPed);
convertView.setTag(holder);
} else{
holder = (ViewHolder) convertView.getTag();
}
holder.img.setImageResource(sapato.getImagem());
holder.edt.setText(""); //adicionei somente esta linha
return convertView;
}
Para uma ListView de visualização apenas (sem edição) isso já seria suficiente. Entretanto, usando elementos editáveis, acho que você vai perder o que botou no EditText caso você role a lista e depois volte pra linha anterior. Pra resolver isso, uma sugestão, é adicionar um TextWatcher nos seus EditText. Toda vez que o valor do EditText é alterado você o armazena em algum lugar. Depois no getView basta usar este valor.
Falou.
M
matheusms
Esse TextWatcher eu tenho que colocar nesta classe aqui?
Tem que adicionar o TextWatcher no teu EditText. Quando tu pega a referência dele, pode chamar o addTextChangedListener passando o TextWatcher. Algo assim:
...holder.edt.setText("");//adicionei somente esta linha holder.edt.addTextChangedListener(newTextWatcher(){publicvoidafterTextChanged(Editables){//logica aqui...}publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){}publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){}});//...
Falou.
M
matheusms
Wagner,
adicionei um TextWatcher e preenchi o valor digitado em um ArrayList, e depois eu tento fazer com que o EditText receba o valor do ArrayList na posição em que se encontra.
Ao fazer isso ele devia adicionar o valor na posição correta, mas ele adiciona em várias posições. Sabe o que pode ser?
Ex:
Digito o valor 2 no EditText da primeira posição da lista. Ele deveria adicionar esse valor na primeira posição da lista, mas ele adiciona em várias posições o valor 2.
Está assim meu código:
publicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){// Recupera o Sapato da posição atualsapato=lista.get(position);if(convertView==null){LayoutInflaterinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);holder=newViewHolder();convertView=inflater.inflate(R.layout.list_pedidos,null);holder.img=(ImageView)convertView.findViewById(R.id.imgPed);holder.edt=(EditText)convertView.findViewById(R.id.editTextt);finalLinearLayoutlayout;layout=(LinearLayout)convertView.findViewById(R.id.LayoutPed);convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();}holder.img.setImageResource(sapato.getImagem());if(teste.size()>0){holder.edt.setText(teste.get(position));}elseholder.edt.setText("");holder.edt.addTextChangedListener(newTextWatcher(){@OverridepublicvoidonTextChanged(CharSequencearg0,intarg1,intarg2,intarg3){}@OverridepublicvoidbeforeTextChanged(CharSequencearg0,intarg1,intarg2,intarg3){}@OverridepublicvoidafterTextChanged(Editables){if(s!=null){teste.add(s.toString());}}});returnconvertView;
Desde já agradeço!
Abraço!
M
matheusms
Tentei de um jeito aqui e fico um pouco melhor, mais anda esta gravando na posição errada.
Se eu digita um valor na primeira linga do ListView ele grava na ultima posição que aparece, se eu for rolando a listview e digita um novo valor ele sempre grava na ultima posição da list view que aparece na tela.
Ficou assim meu código:
...if(sapato.getValor()!=null){holder.edt.setText(sapato.getValor());Log.i("CHB","Valor do EditText: "+sapato.getValor());}elseholder.edt.setText("");holder.edt.addTextChangedListener(newTextWatcher(){@OverridepublicvoidonTextChanged(CharSequencearg0,intarg1,intarg2,intarg3){}@OverridepublicvoidbeforeTextChanged(CharSequencearg0,intarg1,intarg2,intarg3){}@OverridepublicvoidafterTextChanged(Editables){if(s!=null){sapato.setValor(s.toString());//teste.add(s.toString());Log.i("CHB","TEXTO: "+s.toString());}}});Log.i("POSICAO","Posicao: "+position);returnconvertView;}
vcsmetallica
Galera,
Estou com problemas com o EditText dentro do ListView.
O meu problema é o seguinte. O foco sempre começa no ultimo registro.
E quando vou editar ele deixa eu editar somente 3 devido ao campo de visao que eu tenho no tablet.
Alguem sabe como resolver isso?
Att
Vinicius
Marky.Vasconcelos
Eu tentaria com o setNextFocusDownId ou setNextForwardFocusId para honeycomb>
vcsmetallica
Passei os valores nos metodos e continuou a mesma coisa.
Att
T
Thiago_implements_Sk
Cara ele salva na mesma posicao pois seu int esta setado como final !
assim, ele pode ser instanciado apenas uma vez, e sempre sera aquele valor!
tente alterar pra ver !
Abarços!