Wie eine Radio-Button und eine EditText innerhalb Listview zeigen?
-
28-09-2019 - |
Frage
Ich möchte RadioButton- und EditText in einer Reihe eines Listview implementieren. Ich verwende eine ArrayAdapter die Liste zu füllen. Aber das Problem ist, dass wenn ich eine RadioButton- bin die Auswahl und blättern Sie die Liste nach unten und nach oben wieder die Radiobutton, die ausgewählt wurde nicht ausgewählt ist. Das Gleiche gilt für den Inhalt der EditText. Der Text immer entfernt, wenn ich nach oben.
Lösung
Überprüfen Sie die Adapter, sind Sie wahrscheinlich den Job richtig auf bindView()
nicht tun. Sie haben wieder einstellen auf bindView()
die Werte.
werde ich den Satz umformulieren, und Sie werden wahrscheinlich verstehen.
Die newView()
schafft nur 5-10 Ansichten (wie viele passen sie auf dem Bildschirm), und sie sind für die anderen Zeilen wiederverwendet werden. Wenn Sie eine ListView
mit 200 Zeilen darin haben, haben Sie eigentlich nur 5-10 Ansichten, und Sie müssen sicherstellen, aktualisieren Sie die Ansichten mit den gültigen Änderungen in bindView()
. Sie haben zum Speichern / Speichern Sie die Änderungen an ein Objekt zur späteren Wiederverwendung.
Andere Tipps
Das Problem ist, dass alle Ansichten, die den Bildschirm verlassen kann der Speicher auf dem Handy zu speichern bekommen zerstört. Wenn das Telefon würde diese eine Liste mit 1000 Einträgen nicht tun würde, den Speicher des Geräts füllen.
Aufgrund dass die Zustandsänderung, die den Radiobutton und der Text geschieht, die in der EditText eingefügt wurden, werden einfach gelöscht werden, und wenn der Benutzer blättert nach oben der Ansicht wird neu erstellt werden.
Sie müssen den Zustand des Radiobutton und das Bearbeiten von Text in Ihrem Adapter und Neuanlage den Zustand im Moment speichern Sie die Ansicht für dieses spezielle Element in Ihnen neu getView Methode.
getView Funktion in der Base Adapter. Speichert den EditText Wert und zeigt die gleiche, wenn convertView nicht null ist.
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 ;
}