2

在我的应用程序中,我使用带有文本视图、编辑文本和按钮的自定义列表视图。当我单击“0”位置的按钮并更改“0”位置的文本视图值时。当我向下滚动列表时-查看“0”位置文本视图中的值更改为初始状态。

我的基本适配器类

public class sample extends BaseAdapter{

public ArrayList<HashMap<String, String>> list;
Activity activity;

public sample(Activity activity,ArrayList<HashMap<String, String>> list) {
    super();
    this.activity = activity;
    this.list = list;
}

public int getCount() {
    // TODO Auto-generated method stub
    return list.size();
}

public Object getItem(int position) {
    // TODO Auto-generated method stub
    return list.get(position);
}

public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

class ViewHolder {

    Button order;
    TextView item_name, order_qty;
    EditText et_quantity;

}

public View getView(final int position, View convertView,final ViewGroup parent) {
    // TODO Auto-generated method stub



    final ViewHolder holder;
    LayoutInflater inflater = activity.getLayoutInflater();

    if (convertView == null) {

        convertView = inflater.inflate(R.layout.order_custom, null);

        holder = new ViewHolder();

        holder.order = (Button) convertView.findViewById(R.id.order);
        holder.item_name = (TextView) convertView.findViewById(R.id.item_name);
        holder.order_qty = (TextView) convertView.findViewById(R.id.order_count);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
try{
    HashMap<String, String> map = list.get(position);

    holder.item_name.setText(map.get("name"));

    //Log.v("Available or not", ""+map.get("available"));


}catch(Exception e){
    e.printStackTrace();
}


holder.order.setOnClickListener(new View.OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        //here am click the button to change order count text value
        int qty = Integer.valueOf(""+holder.order_qty.getText().toString());

        qty++;

        holder.order_qty.setText(""+String.valueOf(qty));
 }
});


return convertView;
}

}

我不知道为什么向下滚动自定义列表视图时文本值会更改为初始状态。有人知道请帮我解决这个问题

4

2 回答 2

6

问题是您没有为每一行使用不同的视图持有人,并且在回收您的列表项视图时,您的持有人被洗牌在一起。

您可以看到这只是向final int position您的持有者添加一个字段,存储 getView 位置参数的位置;调试,你会看到会发生什么。

因此,您不能使用持有者来存储您的数量值

此外,您没有使用变量list来存储数量值。这段代码对我有用:

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

    final ViewHolder holder;
    LayoutInflater inflater = activity.getLayoutInflater();

    if (convertView == null) {

        convertView = inflater.inflate(R.layout.order_custom, null);

        holder = new ViewHolder();

        holder.order = (Button) convertView.findViewById(R.id.order);
        holder.item_name = (TextView) convertView.findViewById(R.id.item_name);
        holder.order_qty = (TextView) convertView.findViewById(R.id.order_count);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    try{
        HashMap<String, String> map = list.get(position);

        holder.item_name.setText(map.get("name"));
        holder.order_qty.setText(map.get("quantity"));

        //Log.v("Available or not", ""+map.get("available"));


    }catch(Exception e){
        e.printStackTrace();
    }


    holder.order.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            //here am click the button to change order count text value
            int qty = Integer.valueOf(list.get(position).get("quantity"));

            qty++;

            holder.order_qty.setText(""+String.valueOf(qty));
            list.get(position).put("quantity", qty+"");
        }
    });


    return convertView;
}
于 2013-09-13T09:11:23.083 回答
0

我遇到了同样的问题。上一个答案中描述了问题的原因,但是建议的代码块无助于解决我的问题。

我在列表视图中添加了 350 条记录,一个适配器对象有四个 EditText。

TextWatcher 侦听器总是发生意外行为。

我使用焦点检查监听器来解决这个问题:

holder.priceView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus)
                    {
                       // saving data on focus loss.
                       p.setPrice(holder.priceView.getText().toString());
                    }
                }
            });

// holder is my ViewHolder object , priceView is a editText in holder object, p is a reference of my data model.

这可行,但实时更新可能不如预期 - 就像文本观察者一样。

还有最坏的情况,当触发最后一个动作时(没有焦点丢失,最后编辑的值不会被触发和更新)。

于 2017-10-26T18:19:38.103 回答