Como mostrar um Radiobutton e um EdittExt Inside ListView?
-
28-09-2019 - |
Pergunta
Quero implementar o Radiobutton e o EditText dentro de uma linha de uma ListView. Estou usando um Arrayadapter para preencher a lista. Mas o problema é que, quando estou selecionando um radiobutão e role a lista e role novamente o radiobutton que foi selecionado não é selecionado. O mesmo com o conteúdo do EditText. O texto é removido quando eu rolar para cima.
Solução
Verifique seu adaptador, você provavelmente não faz o trabalho bindView()
. Você tem que definir novamente bindView()
os valores.
Vou reformular a frase e você provavelmente entenderá. o newView()
Cria apenas 5 a 10 visualizações (quantos eles se encaixam na tela) e são reutilizados para outras linhas. Se você tem um ListView
Com 200 linhas, na verdade você tem apenas 5 a 10 visualizações e precisa atualizar as visualizações com as alterações válidas em bindView()
. Você precisa armazenar/salvar as alterações em um objeto para reutilização posterior.
Outras dicas
O problema é que todas as visualizações que deixam a tela podem ser destruídas para salvar a memória no telefone. Se o telefone não fizesse isso, uma lista com 1000 entradas preencheria a memória do seu dispositivo.
Por causa disso, a mudança de estado que está acontecendo com o radiobutton e o texto que foi inserido no EdittExt será simplesmente excluído e se o usuário rolar a visualização será recriado.
Você precisa salvar o estado do radiobutton e o texto de edição em seu adaptador e reaplicar o estado no momento em que você recrie a visão desse item especial em você getView método.
função getView no adaptador base. Salva o valor EditText e exibe o mesmo se o ConvertView não for nulo.
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_row_person, null);
holder = new ViewHolder();
holder.PersonNameView = (TextView) convertView.findViewById(R.id.PersonNameView);
holder.SpendAmount = (EditText) convertView.findViewById(R.id.SpendAmt);
holder.SpendAmount.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
int position2 = holder.SpendAmount.getId();
EditText Caption = (EditText) holder.SpendAmount;
Person per= (Person)holder.SpendAmount.getTag();
//SpendAmount is of Double type
if(s.toString().length()>0){
per.setSpendAmount(Double.parseDouble(s.toString()));
per.setFlag(true);}
else{
Toast.makeText(getApplicationContext(), "Please enter some value", Toast.LENGTH_SHORT).show();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
holder.SpendAmount.setTag(listData.get(position));
convertView.setTag(holder);
} else {
((ViewHolder)convertView.getTag()).SpendAmount.setTag(listData.get(position));
holder = (ViewHolder) convertView.getTag();
}
holder.PersonNameView.setText(listData.get(position).getPersonName());
holder.SpendAmount.setText(listData.get(position).getSpendAmount().toString());
return convertView;
}
class ViewHolder {
TextView PersonNameView;
EditText SpendAmount ;
}