我的listview发生了一件非常奇怪的事情。我正在创建一个带有按钮和editText的ListView。
它的布置如下:[Button] [EditText] [Button],按钮的工作方式类似于“增量器”和“减量器”,以每单击1个单位更新EditText的数值。 问题是,当我单击一个按钮时,几乎每次更改另一个列表视图元素的editText时(所单击项目的editText也会更改)。如果我点击这个错误更改项目的按钮,它也会更改第一个的editText。它们基本上具有相同的button和editText引用,尽管它们有textViews和数据,并且它们之间的数据不同。
要完成我创建的和自定义适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = mInflater.inflate(R.layout.lastproduct_row, null);
holder = new ViewHolder();
holder.btnAddQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_add_qtd);
holder.btnSubQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_sub_qtd);
holder.etQuantidade = (EditText) convertView.findViewById(R.lastproduct_row.et_quantidade);
TextView tv;
holder.tvList = new TextView[PRODUCTROW_INT_KEY.length];
for(int i = 0; i < PRODUCTROW_INT_KEY.length; i++) {
tv = (TextView) convertView.findViewById(PRODUCTROW_INT_KEY[i]);
holder.tvList[i] = tv;
}
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
HashMap<String, String> hm = productsList.get(position);
String key = hm.get(CODIGO_KEY);
for(int i = 0; i < PRODUCTROW_INT_KEY.length; i++) {
holder.tvList[i].setText(hm.get(PRODUCTROW_STR_KEY[i]));
}
holder.btnAddQtd.setTag(key+QTD_FLAG+ADD_ACTION);
holder.btnSubQtd.setTag(key+QTD_FLAG+SUB_ACTION);
holder.btnAddQtd.setOnClickListener(handle);
holder.btnSubQtd.setOnClickListener(handle);
if(novosEstoques.containsKey(key)) {
holder.etQuantidade.setText(MyParseFunctions.parseCentesimal(novosEstoques.get(key).getQuantidade()));
}
return convertView;
}
class ViewHolder {
private TextView []tvList;
private Button btnAddQtd, btnSubQtd;
private Button btnAddQtVol, btnSubQtVol;
private EditText etQuantidade, etQtVolume;
}
我在按钮上添加了onClick听众,使用我的listView元素ID设置标签(与其他信息连接)。然后在我的事件监听器中,我只获取按钮父View(一个LinearLayout)并使用getViewAt()从中获取EditText:
@Override
public void onClick(View v) {
String tag = (String) v.getTag();
if(tag.contains(QTD_FLAG)) {
String []info = ((String) v.getTag()).split(QTD_FLAG);
float qtd;
LinearLayout ll = (LinearLayout) v.getParent();
ll.setBackgroundColor(Color.rgb(0, 128, 30));
EditText et = (EditText) ll.getChildAt(2);
qtd = Float.parseFloat(et.getText().toString().replace(",", "."));
if(info[1].equals(ADD_ACTION)) {
qtd++;
}
else if(info[1].equals(SUB_ACTION)) {
if(qtd > 0)
qtd--;
}
Log.d("TESTE", "MODIFICAR KEY = "+info[0]);
et.setText(qtd+"");
}
}
我在此示例中使用setBackgroundColor来确认在LisView中是否重复了LinearLayout实例。当我点击一个Button时,它被绘制在2个不同的列表视图项中。
任何人都可以指出我可以做到这一点?我发现人们有一个重复的ListView项目,我不知道这是不是我的情况,因为我的ListView中有TextView,并且它们不相等,只有带按钮和editText的LinearLayout部分是“共享”。
我在getView方法中进行了一些更改,现在正在运行!似乎每次调用getView方法时我都无法保证我的editTexts将被正确填充,我没有意识到这一点。所以我设置的每个getView调用都设置了editText值,如果用户编辑了ET值,我将它存储在HashMap中以便在getView中恢复,如果HashMap中没有给定editText的条目,那么我将其设置为默认值值(零):
...
if(convertView == null) {
holder = new ViewHolder();
holder.btnAddQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_add_qtd);
holder.btnSubQtd = (Button) convertView.findViewById(R.lastproduct_row.btn_sub_qtd);
holder.etQuantidade = (EditText) convertView.findViewById(R.lastproduct_row.et_quantidade);
//Now it is easier to get etQuantidade reference in button
//click handle, I just have to do:
// public onClick(View v) {
// EditText etButtonAssociated = (EditText) v.getTag();
// ...
// }
holder.btnAddQtd.setTag(holder.etQuantidade);
holder.btnSubQtd.setTag(holder.etQuantidade);
holder.btnAddQtd.setOnClickListener(handle);
holder.btnSubQtd.setOnClickListener(handle);
...
}
else {
...
}
holder.etQuantidade.setTag(key);
if(novosEstoques.containsKey(key)) {
holder.etQuantidade.setText(MyParseFunctions.parseCentesimal(novosEstoques.get(key).getQuantidade()));
}
else {
holder.etQuantidade.setText("0");
}
return convertView;
答案 0 :(得分:0)
以色列,
查看代码后,我想知道您做出的实施决策。由于每个Button都“绑定”到特定的EditText
,您是否考虑过将Tag
Buttons
设置为EditText
? Tag
可以是包含UI元素的任何Object
。这对于动态UI元素尤其有用,例如运行时填充列表。
由于这是在Adapter
中处理的,因此您不必担心重复的父母等。此外,您可以避免担心“找到”onClick()
中的控件,因为您会拥有它(它是标记)。我不确定你的项目需要什么,但这似乎是一个潜在可行的解决方案,除非你需要那些Buttons
来完成其他任务。
注意事项
完成后,请确保删除标签对EditText
的引用。否则,您可能会有泄漏内存的风险。
FuzzicalLogic