我有列表项目与其中的EditText,我不知道将有多少项目.当我在EditText中输入一些文本,然后向下滚动ListView时,我有一个问题,在我再次滚动之后,我的第一个EditText中没有文本,或者有来自ListView的其他EditText的一些文本.
我已经尝试了TextWatcher,并将数据保存到数组,但问题是ListView中返回的视图位置并不总是正确的,所以我从数组中丢失了一些数据.
请帮忙.
这是我的代码:
public class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public String[] Current;
ArrayList<String> MeterName,PrevIoUsReading,Current_Reading;
JSONArray getArray_Meter_Reading;
public EfficientAdapter(Context context,JSONArray getArray_Meter_Reading) {
mInflater = LayoutInflater.from(context);
this.getArray_Meter_Reading = getArray_Meter_Reading;
MeterName = new ArrayList<String>();
PrevIoUsReading = new ArrayList<String>();
for (int i = 0; i < getArray_Meter_Reading.length(); i++) {
try {
String Meter_Name = getArray_Meter_Reading.getJSONObject(i)
.getString("MeterName").toString();
String prevIoUs_Meter_Reading = getArray_Meter_Reading
.getJSONObject(i).getString("PrevMeterReading")
.toString();
MeterName.add(Meter_Name);
PrevIoUsReading.add(prevIoUs_Meter_Reading);
// Meter[i]=MeterName.get(i);
// PrevIoUs[i]=PrevIoUsReading.get(i);
} catch (JSONException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
}
public int getCount() {
return getArray_Meter_Reading.length();
}
public Object getItem(int position) {
// Todo Auto-generated method stub
return position;
}
public long getItemId(int position) {
// Todo Auto-generated method stub
return position;
}
public View getView(int position,View convertView,ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.meter_reading_list,null);
holder = new ViewHolder();
holder.adp_MeterName = (TextView) convertView
.findViewById(R.id.txt_Meter_Name);
holder.adp_PrevIoUs = (TextView) convertView
.findViewById(R.id.txt_PrevIoUs);
holder.adp_Current = (EditText) convertView
.findViewById(R.id.ed_Current);
holder.adp_Current.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s,int start,int before,int count) {
}
public void beforeTextChanged(CharSequence s,int count,int after) {
// Todo Auto-generated method stub
}
public void afterTextChanged(Editable s) {
Current[holder.ref] = s.toString();
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.ref = position;
holder.adp_MeterName.setText(MeterName.get(position));
holder.adp_PrevIoUs.setText(PrevIoUsReading.get(position));
// holder.adp_Current.setHint(MeterName.get(position));
// holder.adp_Current.setText(PrevIoUsReading.get(position));
return convertView;
}
class ViewHolder {
TextView adp_MeterName,adp_PrevIoUs;
EditText adp_Current;
int ref;
}
}
解决方法
尝试这个:
public class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public String[] Current;
ArrayList<String> MeterName,Current_Reading;
JSONArray getArray_Meter_Reading;
public static HashMap<Integer,String> myList=new HashMap<Integer,String>();
public EfficientAdapter(Context context,JSONArray getArray_Meter_Reading) {
mInflater = LayoutInflater.from(context);
this.getArray_Meter_Reading = getArray_Meter_Reading;
MeterName = new ArrayList<String>();
PrevIoUsReading = new ArrayList<String>();
for (int i = 0; i < getArray_Meter_Reading.length(); i++) {
try {
String Meter_Name = getArray_Meter_Reading.getJSONObject(i)
.getString("MeterName").toString();
String prevIoUs_Meter_Reading = getArray_Meter_Reading
.getJSONObject(i).getString("PrevMeterReading")
.toString();
MeterName.add(Meter_Name);
PrevIoUsReading.add(prevIoUs_Meter_Reading);
// Meter[i]=MeterName.get(i);
// PrevIoUs[i]=PrevIoUsReading.get(i);
} catch (JSONException e) {
// Todo Auto-generated catch block
e.printstacktrace();
}
}
// initialize myList
for(int i=0;i<JSON_ARRAY_LENGTH;i++)
{
myList.put(i,"");
}
}
public int getCount() {
return getArray_Meter_Reading.length();
}
public Object getItem(int position) {
// Todo Auto-generated method stub
return position;
}
public long getItemId(int position) {
// Todo Auto-generated method stub
return position;
}
public View getView(int position,ViewGroup parent) {
final ViewHolder holder;
final int pos=position;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.meter_reading_list,null);
holder = new ViewHolder();
holder.adp_MeterName = (TextView) convertView
.findViewById(R.id.txt_Meter_Name);
holder.adp_PrevIoUs = (TextView) convertView
.findViewById(R.id.txt_PrevIoUs);
holder.adp_Current = (EditText) convertView
.findViewById(R.id.ed_Current);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.adp_Current.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s,int count) {
}
public void beforeTextChanged(CharSequence s,int after) {
// Todo Auto-generated method stub
}
public void afterTextChanged(Editable s) {
Current[holder.ref] = s.toString();
myList.put(pos,s.toString.trim());
}
});
holder.ref = position;
holder.adp_MeterName.setText(MeterName.get(position));
holder.adp_PrevIoUs.setText(PrevIoUsReading.get(position));
// holder.adp_Current.setHint(MeterName.get(position));
// holder.adp_Current.setText(PrevIoUsReading.get(position));
holder.adp_Current.setText(myList.get(position));
return convertView;
}
class ViewHolder {
TextView adp_MeterName,adp_PrevIoUs;
EditText adp_Current;
int ref;
}
}
这里我包括了一个HashMap对象,如果EditText包含值,它将会保持注意.当您滚动列表视图时,它将再次通过调用其getView方法以及与每个edittext关联的文本再次呈现.
在这段代码中,当你首次加载listview时,所有的edittext都将没有text.once,你会输入一些文本,它将在myList中被注明.当你再次渲染列表时,你的文本将被阻止.
还有一件事,你应该在外部实现textwatcher if(convertView == null).. else .. block.这是一个更好的做法!