J'ai un ListView
personnalisé que chaque élément de ListView
contient deux EditTexts
. Par exemple quand je mets des valeurs pour EditText
s dans le premier article de ListView
, et après que je défile jusqu'à la fin de ListView
, je vois que le dernier article de ListView
est rempli automatiquement, et aussi quand je fais défiler vers le haut, le premier article perd ses valeurs.EditText perd de la valeur lors du défilement ListView android
REMARQUE: J'utilise TextWatcher
dans ce cas. Que dois-je faire pour résoudre ce problème?
Ceci est mon adaptateur:
public class MyResultAdapter extends ArrayAdapter<Integer> {
ArrayList<HashMap<String, String>> boardInformation = new ArrayList<>();
EditText foodPrice;
EditText foodName;
Context context;
int layoutView;
public MyResultAdapter(Context context, int layoutView) {
super(context, layoutView);
this.context = context;
this.layoutView = layoutView;
}
public View getView(int position, View convertView, ViewGroup parent){
View view = convertView;
boolean convertViewWasNull = false;
if(view == null)
{
view = LayoutInflater.from(getContext()).inflate(layoutView, parent, false);
convertViewWasNull = true;
}
foodPrice = (EditText) view.findViewById(R.id.food_price);
foodName = (EditText) view.findViewById(R.id.food_name);
if(convertViewWasNull)
{
//be aware that you shouldn't do this for each call on getView, just once by listItem when convertView is null
foodPrice.addTextChangedListener(new GenericTextWatcher(foodPrice, position, "price"));
foodName.addTextChangedListener(new GenericTextWatcher(foodName, position, "name"));
}
return view;
}
private class GenericTextWatcher implements TextWatcher{
private View view;
private int position;
private String name;
private GenericTextWatcher(View view, int position, String name) {
this.view = view;
this.position = position;
this.name = name;
}
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
public void afterTextChanged(Editable editable)
{
updateBoardInformationArray(editable.toString());
}
private void updateBoardInformationArray(String newValue)
{
if(name.equals("name")) boardInformation.get(position).put("food_name", newValue);
else boardInformation.get(position).put("food_price", newValue);
}
}
}
Eh bien, mec, je voudrais vous suggérez deux choses, d'abord essayer de travailler avec ViewHolder Pattern et étendre BaseAdapter pour votre adaptateur. Deuxièmement, essayez d'éviter listView la prochaine fois - utilisez Recycler View à la place, c'est beaucoup mieux que listview –