滚动 ListView 时 EditText 丢失值 android
EditText loses value when scrolling ListView android
我有一个习惯ListView
,ListView
的每一项包含两个EditTexts
。
例如,当我将 EditText
的值放在 ListView
的第一项中,然后向下滚动到 ListView
的末尾时,我看到 ListView
的最后一项] 会自动填充,而且当我向上滚动时,第一项会丢失其值。
注意: 在这种情况下我使用 TextWatcher
。
我应该怎么做才能解决这个问题?
这是我的适配器:
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);
}
}
}
我假设您知道您正在使用 convertView
重用 ListView
中的视图 -- 重用离开屏幕的相同视图用于进入屏幕的视图。
i see that the last item of listview is filled automatically
这可能是因为该视图已从您在 EditText
中输入了一些文本的另一个视图中重复使用。
and also when i scrolling up, the first item loses its values.
同上原因。此位置正在重用其他一些视图。
解法:
将用户输入的文本保存在一些模型对象的列表中。比如像这样ArrayList<MyData>
。 MyData
对象具有键入的文本。列表中的每一项都有一个对象。
现在在 getView
回调中从 ArrayList<MyData>
获取相应位置的文本并将其设置为 EditText
。
我有一个习惯ListView
,ListView
的每一项包含两个EditTexts
。
例如,当我将 EditText
的值放在 ListView
的第一项中,然后向下滚动到 ListView
的末尾时,我看到 ListView
的最后一项] 会自动填充,而且当我向上滚动时,第一项会丢失其值。
注意: 在这种情况下我使用 TextWatcher
。
我应该怎么做才能解决这个问题?
这是我的适配器:
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);
}
}
}
我假设您知道您正在使用 convertView
重用 ListView
中的视图 -- 重用离开屏幕的相同视图用于进入屏幕的视图。
i see that the last item of listview is filled automatically
这可能是因为该视图已从您在 EditText
中输入了一些文本的另一个视图中重复使用。
and also when i scrolling up, the first item loses its values.
同上原因。此位置正在重用其他一些视图。
解法:
将用户输入的文本保存在一些模型对象的列表中。比如像这样ArrayList<MyData>
。 MyData
对象具有键入的文本。列表中的每一项都有一个对象。
现在在 getView
回调中从 ArrayList<MyData>
获取相应位置的文本并将其设置为 EditText
。