Android 上下滚动时,ListView中的EditText会丢失值

Android 上下滚动时,ListView中的EditText会丢失值,android,listview,scroll,android-edittext,Android,Listview,Scroll,Android Edittext,我已经在ListView的编辑文本中输入了值,但是当我上下滚动时,这些值没有聚焦和丢失。请帮帮我。我是新手 我尝试了TextWatcher,并将数据保存到array,但问题是ListView中返回的视图位置并不总是正确的,所以我从array中丢失了一些数据 这是我的密码 public class ListViewAdapter extends BaseAdapter { private Context context; private ArrayList<HashMap<String

我已经在ListView的编辑文本中输入了值,但是当我上下滚动时,这些值没有聚焦和丢失。请帮帮我。我是新手

我尝试了
TextWatcher
,并将数据保存到
array
,但问题是
ListView
中返回的视图位置并不总是正确的,所以我从array中丢失了一些数据

这是我的密码

public class ListViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<HashMap<String, String>> data;
private LayoutInflater inflater;
private View itemView;
HashMap<String, String> Result = new HashMap<String, String>();
private Bitmap ImageCover;

private TextView bookname;
private TextView bookcode;
private TextView index;
private ImageView bookcover;
private String BookIDSend;
private String QtySend;
private EditText TxtStock;
private String[] valueList;
private boolean InputState;

public ListViewAdapter(Context context, ArrayList<HashMap<String, String>> arraylist, boolean state) {
    this.context    = context;
    data            = arraylist;
    valueList       = new String[data.size()];
    InputState      = state;
}
@Override
public int getCount() { 
    return data.size();
}
@Override
public Object getItem(int position) {
    return position; }

@Override
public long getItemId(int position) { 
    return position; }

public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        inflater    = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        itemView    = inflater.inflate(R.layout.input_list_item, parent, false);
        if ( ( position % 2 ) == 0 ) {
            itemView.setBackgroundColor(Color.rgb(250,235,215));
        } else {
            itemView.setBackgroundColor(Color.rgb(255,235,205));
        }
        Result                  = data.get(position);
        ClassFile FileName      = new ClassFile();
        String AppDirectory     = FileName.GetAppDirectory(context);
        String Directory        = AppDirectory+"/cover/";

        index                   = (TextView) itemView.findViewById(R.id.numb);
        bookname                = (TextView) itemView.findViewById(R.id.book_name);
        bookcode                = (TextView) itemView.findViewById(R.id.code_book_input);
        bookcover               = (ImageView) itemView.findViewById(R.id.imgCover);
        TxtStock                = (EditText) itemView.findViewById(R.id.EdtIsi);
        TxtStock.setText(Result.get(InputActivity.INITIAL_STOCK));

        final int pos   = position;
        valueList[pos]  = Result.get(InputActivity.INITIAL_STOCK);
        if (InputState){
            TxtStock.setEnabled(true);
        }else{
            TxtStock.setEnabled(false);
        }
        TxtStock.addTextChangedListener(new TextWatcher() {
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }
            public void beforeTextChanged(CharSequence s, int start, int count,int after) {
            }
            public void afterTextChanged(Editable s) {
                valueList[pos] = s.toString().trim();
            }
        });
        bookname.setText(Result.get(InputActivity.BOOKNAME));
        bookcode.setText(Result.get(InputActivity.BOOK_CODE));
        ClassImage Procimg      = new ClassImage();
        ImageCover              = Procimg.decodeSampledBitmapFromUri( Directory + Result.get(InputActivity.BOOKCOVER), 90, 120);
        bookcover.setImageBitmap(ImageCover);
    }else {
        itemView    = convertView;
    }

    int j = position+ 1;
    index.setText("" + j);
    return itemView;
}
公共类ListViewAdapter扩展了BaseAdapter{
私人语境;
私有数组列表数据;
私人充气机;
私有视图项目视图;
HashMap结果=新建HashMap();
私人位图图像封面;
私有文本视图书名;
私有文本视图图书代码;
私有文本视图索引;
私家书皮;
私有字符串booksend;
私有字符串QtySend;
私人编辑文本TxtStock;
私有字符串[]值列表;
私有布尔输入状态;
公共ListViewAdapter(上下文上下文、ArrayList ArrayList、布尔状态){
this.context=上下文;
数据=数组列表;
valueList=新字符串[data.size()];
输入状态=状态;
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;}
@凌驾
公共长getItemId(int位置){
返回位置;}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
if(convertView==null){
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
itemView=充气机。充气(R.layout.input\u list\u项目,父项,false);
如果((位置%2)==0){
setBackgroundColor(Color.rgb(250235215));
}否则{
setBackgroundColor(Color.rgb(255235205));
}
结果=数据。获取(位置);
ClassFile FileName=新的ClassFile();
字符串AppDirectory=FileName.GetAppDirectory(上下文);
String Directory=AppDirectory+“/cover/”;
index=(TextView)itemView.findViewById(R.id.numb);
bookname=(TextView)itemView.findViewById(R.id.book\u name);
bookcode=(TextView)itemView.findViewById(R.id.code\u book\u输入);
bookcover=(ImageView)itemView.findViewById(R.id.imgCover);
TxtStock=(EditText)itemviewbyd(R.id.EdtIsi);
setText(Result.get(InputActivity.INITIAL_STOCK));
最终int pos=位置;
valueList[pos]=结果.get(输入活动.初始库存);
如果(输入状态){
TxtStock.setEnabled(true);
}否则{
TxtStock.setEnabled(false);
}
addTextChangedListener(新的TextWatcher(){
public void onTextChanged(字符序列、int start、int before、int count){
}
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
公共无效后文本已更改(可编辑){
valueList[pos]=s.toString().trim();
}
});
bookname.setText(Result.get(InputActivity.bookname));
bookcode.setText(Result.get(InputActivity.BOOK_CODE));
ClassImage Procimg=新ClassImage();
ImageCover=Procimg.decodeSampledBitmapFromUri(目录+结果.get(InputActivity.BOOKCOVER)),90120;
bookcover.setImageBitmap(ImageCover);
}否则{
itemView=convertView;
}
int j=位置+1;
index.setText(“+j”);
返回项目视图;
}

thx before

滚动列表视图时,它将调用方法
getView()
,因此您需要将文本设置为EditText,因此您需要做的是:


TxtStock.setText(valueList[pos]);

首先在ListView中使用EditText不是一个好主意!但是如果必须这样做,您可以尝试一下

像这样更改代码

@Override
public Object getItem(int position) {
return data.get(position); }
在getView(..)方法中,您正在回收视图,这就是您丢失数据的原因

移动此行“TxtStock.setText(Result.get(InputActivity.INITIAL_STOCK)); 在getView(..)内的if..else条件之外


希望这有帮助。convertView为null时只调用findViewById,当回收视图时,所有其他set方法都应该在if..else条件之外调用。谢谢!!;D

我想指出一个错误,在方法getItem中,您必须返回数据[position]……
公共对象getItem(int position){return data[position];}
error先生。它说“表达式的类型必须是数组”@Ranjith
return data.get(position);
data是数组列表。什么都没有发生,先生@iforessoh..我的错..我是指数据。get[position]…@iForests谢谢你的更正。。