Come mostrare un RadioButton e un EditText all'interno ListView?
-
28-09-2019 - |
Domanda
Voglio realizzare RadioButton e EditText all'interno di una riga di una ListView. Sto usando un ArrayAdapter per popolare la lista. Ma il problema è che quando sto selezionando un RadioButton e scorrere l'elenco e scorrere di nuovo il pulsante radio che era stato selezionato non è selezionata. Lo stesso con il contenuto del EditText. Il testo ottenendo rimosso quando ho scorrere verso l'alto.
Soluzione
Controlla il tuo adattatore, si sono probabilmente non fare il proprio lavoro su bindView()
. È necessario impostare nuovamente bindView()
i valori.
io riformulare la frase e probabilmente capirà.
Il newView()
crea solo 5-10 viste (come molti si inseriscono sullo schermo), e sono riutilizzati per altre righe. Se si dispone di un ListView
con 200 linee in esso, in realtà si hanno solo 5-10 punti di vista, e si deve fare in modo di aggiornare i punti di vista con le modifiche valide in bindView()
. È necessario memorizzare / salvare le modifiche apportate a un oggetto per un successivo riutilizzo.
Altri suggerimenti
Il problema è che tutte le viste che lasciano lo schermo possono ottenere distrutto per risparmiare memoria sul telefono cellulare. Se il telefono non avrebbe fatto questa lista a con 1000 voci sarebbe riempire la memoria del dispositivo.
A causa di ciò il cambiamento di stato che sta accadendo il pulsante radio e il testo che è stato inserito nel EditText saranno semplicemente cancellati e se verranno ricreate l'utente scorre la vista.
È necessario salvare lo stato del RadioButton e modificare il testo in vostro adattatore e riapplicare lo stato al momento di ricreare la vista per un determinato oggetto in voi metodo GetView .
funzione GetView in adattatore Base. Salva il valore EditText e mostra lo stesso se convertView non è nullo.
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 ;
}