android - ListView edittext 数据在 Android 中滚动时丢失

标签 android listview android-edittext

我希望具有 2 个编辑文本的 ListView 即使在滚动后变得不可见后也能保留值。当 edittext 失去焦点时,我希望将每个 edittext 值保存在一个数组列表中(2 个数组列表 - 一个用于数量,一个用于价格),稍后我可以将其保存到数据库中。 我尝试将代码放在 OntextChanegd 方法中,但它似乎不正确。

public class CustomAdapter extends BaseAdapter {
ArrayList<String> names;
Context context;
ArrayList<String> itemPrices = new ArrayList<>();
ArrayList<String> quantities = new ArrayList<>();

CustomAdapter(ArrayList v, Context c) {
    names = v;
    context = c;
}

@Override
public int getCount() {
    return names.size();
}

@Override
public Object getItem(int position) {
    return names.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    try {
        final ViewHolder holder;
        // TODO Auto-generated method stub
        if (convertView == null) {
            holder = new ViewHolder();

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row, null);

            holder.textView = (TextView) convertView.findViewById(R.id.rowText);
            holder.editQty = (EditText) convertView.findViewById(R.id.qty);
            holder.editprice = (EditText) convertView.findViewById(R.id.price);
            holder.textView.setTextSize(20);
            holder.textView.setTextColor(Color.BLACK);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.ref = position;

        holder.textView.setText(names.get(position));
        holder.editQty.setHint("Quantity");
        holder.editprice.setHint("Price");
        holder.editQty.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        holder.editprice.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });



        return convertView;
    }catch (NumberFormatException ex){
        Toast.makeText(context,"!!!",Toast.LENGTH_SHORT).show();
        ex.printStackTrace();
    }


    return convertView;
}




private class ViewHolder {
    TextView textView;
    EditText editQty;
    EditText editprice;

    int ref;
}

最佳答案

将监听器添加到 ViewHolder

 private class ViewHolder {
        TextView textView;
        EditText editQty;
        EditText editprice;
        TextWatcher qtyWatcher;
        TextWatcher priceWatcher;
        int ref;
    }

现在在 getView() 方法中删除 edittext 的现有监视程序,然后更新 edittext 中的文本并设置新的文本监视程序。

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    try {
        final ViewHolder holder;
        // TODO Auto-generated method stub
        if (convertView == null) {
             holder = new ViewHolder();

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.row, null);

        holder.textView = (TextView) convertView.findViewById(R.id.rowText);
        holder.editQty = (EditText) convertView.findViewById(R.id.qty);
        holder.editprice = (EditText) convertView.findViewById(R.id.price);
        holder.textView.setTextSize(20);
        holder.textView.setTextColor(Color.BLACK);

        convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.ref = position;
        if (holder.qtyWatcher != null) {
            holder.editQty.removeTextChangedListener(holder.qtyWatcher);
        }
        if (holder.priceWatcher != null) {
            holder.editprice.removeTextChangedListener(holder.priceWatcher);
        }
        holder.textView.setText(names.get(position));
        holder.editQty.setHint("Quantity");
        holder.editprice.setHint("Price");
        if(position<quantities.size())
            holder.editQty.setText(quantities.get(position));
        else
            holder.editQty.setText("");
        if(position<itemPrices.size())
            holder.editprice.setText(itemPrices.get(position));
        else
          holder.editprice.setText("");
        holder.qtyWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                    int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                //Update the quantity
            }
        };
        holder.editQty.addTextChangedListener(holder.qtyWatcher);
        holder.priceWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start,
                    int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start,
                    int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                //Update you price
            }
        };
        holder.editprice.addTextChangedListener(holder.priceWatcher);

        return convertView;
    } catch (NumberFormatException ex) {
        Toast.makeText(context, "!!!", Toast.LENGTH_SHORT).show();
        ex.printStackTrace();
    }
    return convertView;
}

关于android - ListView edittext 数据在 Android 中滚动时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30528328/

相关文章:

android - EditText 没有填满窗口的整个高度

android - 没有 ActionBar 的基于 fragment 的选项卡

android - 谁能帮我从 png 图像创建 9 个补丁图像?

android - ListView:动态更改 sibling 的数据

android - 为 Android 更改 ListView textSize

java - 如何忽略空的EditText?

java - Eclipse 中的 Android 应用程序 : Edit text not showing on Graphical layout

android - 有没有办法将 TextView 的所有字母设置为大写?

java - 在网络的 ImageView 中显示 .jpg

c# - 如何将焦点设置在 Listview 中的 Entry 上? Xamarin 表格