Android 自定义listview复选框和编辑框在向下滚动时丢失数据

Android 自定义listview复选框和编辑框在向下滚动时丢失数据,android,listview,checkbox,Android,Listview,Checkbox,大家好,我是android新手,当我选中复选框并在editText中输入数据,滚动Listview并返回到该框时,我会使用editText和复选框自定义Listview,将其状态更改为以前的状态意味着未选中和editText框数据丢失公开的 public View getView(final int position, View arg1, ViewGroup viewGroup) { final ViewHolder holder; if (arg1 == null) {

大家好,我是android新手,当我选中复选框并在
editText
中输入数据,滚动
Listview
并返回到该框时,我会使用
editText
复选框自定义
Listview
,将其状态更改为以前的状态意味着未选中和
editText
框数据丢失公开的

public View getView(final int position, View arg1, ViewGroup viewGroup) {

    final ViewHolder holder;

    if (arg1 == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        arg1 = inflater.inflate(R.layout.stocklistcustom, viewGroup, false);
        holder.checkbox1 = (CheckBox) arg1.findViewById(R.id.checkbox1);
        holder.Des = (TextView) arg1.findViewById(R.id.description);
        holder.stockid = (TextView) arg1.findViewById(R.id.stockid);
        holder.done = (EditText) arg1.findViewById(R.id.quantity);

        holder.stockid.setText(listItem.get(position));
        holder.Des.setText(listAddress.get(position));
        holder.done.setText(quantity.get(position));

        holder.checkbox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int i = 0;
                if (holder.checkbox1.isChecked()) {

                    String id, qu, des, stc;
                    id = idlist.get(position);
                    qu = quantity.get(position);
                    des = listAddress.get(position);
                    stc = listItem.get(position);

                    ItemID_list.add(i, id);
                    StockCode_list.add(i, stc);
                    Description_list.add(des);
                    Quantity_list.add(i, holder.done.getText().toString());


                } else {

                    ItemID_list.remove(i);
                    StockCode_list.remove(i);
                    Description_list.remove(i);
                    Quantity_list.remove(i);
                    i--;
                }
            }
        });




        arg1.setTag(holder);
    }
    else {
        holder = (ViewHolder) arg1.getTag();
    }



    //date.setText(dates);



    return arg1;
}

static class ViewHolder{
    CheckBox checkbox1;
    TextView Des;
     TextView stockid;
    EditText done;


}

这是我的getview函数。如果任何主体可以解决此问题,请创建布尔值“isChecked”并更新代码

checkbox1.setChecked(isChecked);
checkbox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    this.isChecked = isChecked;
    //Follow as you code......................
  }
});

这里的问题是,您没有保存滚动时由listview创建的视图。因此,首先要了解listview是如何工作的,它总是在滚动convertView时从convertView创建一个新实例。因此,我建议您使用listview和setTag()函数的ViewHolder模式来设置信息,并在回滚时通过getTag()从中检索信息

    static class ViewHolder{
    CheckBox checkbox1;
    TextView Des;
    final TextView stockid;
    final EditText done;
    }
并将getView中的代码更改如下:

View getView(final int position, View arg1, ViewGroup viewGroup) {
    ViewHolder holder = new ViewHolder();
    if(arg1 == null){
        arg1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.stocklistcustom, viewGroup, false);
//Now set all your views using arg1
//do all your stuff
arg1.setTag(holder);
    }else{
    holder = (ViewHolder) arg1.getTag();
}

return arg1;

在Android中将RicyView与ViewHolder一起使用感谢您的反馈您能给我任何可以解决我的此问题的链接吗我搜索了很多机器人故障第一个u用户RicyView而不是ListView@NaveenTamrakar,它解决不了问题。问题是,一旦价值观发生变化,你就必须保存这些价值观。请查看这个链接@Media,这几乎不是建设性的批评。请解释您为什么这样认为,或者根本不要留下评论。在getView方法中,您总是为每个项扩展新视图,并且其复选框也为“拥有新实例”。很抱歉,如果我使用了不好的词语,但我使用了此代码,它不起作用。谢谢你的建议,先生,这对我很有用,但是当我选中一个复选框时,它会选中下面的另一个复选框来。这是因为每当发生滚动事件时,convertView都会重新初始化视图。这在listView中是不可避免的。因此,如果您的数据较少,请使用ScrollView,或者使用RecyclerView和ViewHolder来实现这一点。如果您熟悉SQLiteDatabase,则可以使用它将复选框的每次单击存储在表中,并在滚动时根据您的项目位置检索它。我将尝试此方法。现在,我正试图用带有ViewHolder的RecyclerView解决这个问题