在我的应用程序中使用带有文本视图,编辑文本和按钮的自定义列表视图。当我单击“0”位置的按钮时,我将文本视图值更改为“0”Th位置。当我滚动时在列表视图中,“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;
}
}
我不知道为什么在向下滚动自定义列表视图时文本值会更改为初始状态。任何人都知道请帮我解决此问题
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我遇到了同样的问题。上一个答案中描述了问题的原因,但建议的代码块无法解决我的问题。
我在列表视图中添加了350条记录,一个适配器对象有四个EditTexts。
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.
这样可行,但实时更新可能不像预期的那样 - 就像文本观察者一样。
最糟糕的情况是,当触发最后一个动作时(没有焦点丢失,最后编辑的值不会被触发和更新)。