gpt4 book ai didi

android - ListView 中的重复布局引用

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:16 25 4
gpt4 key购买 nike

我的 ListView 发生了一件非常奇怪的事情。我正在创建一个带有按钮和一个 editText 的 ListView。

它是这样设置的:[Button] [EditText] [Button],这些按钮就像一个“递增器”和“递减器”,每次点击更新 1 个单位的 EditText 数值。问题是,当我单击一个按钮时,几乎每次另一个 ListView 元素的 editText 都会更改(被单击项目的 editText 也会更改)。如果我点击这个错误更改项目的按钮,它也会更改第一个的 editText。它们基本上具有相同的按钮和 editText 引用,尽管它们具有带数据的 textView,并且它们之间的数据不同。

为此我创建并自定义了适配器:

    @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 来确认 LinearLayout 实例在 lisView 中是重复的。当我单击一个按钮时,它会绘制在 2 个不同的 ListView 项中。

任何人都可以指出我可以做什么?我发现有人有重复的 ListView 项目,我不知道我的情况是否如此,因为我的 ListView 中有 TextView,它们不相等,只有带有按钮和 editText 的 LinearLayout 部分是“共享的”。


我对 getView 方法进行了一些更改,它现在可以正常工作了!似乎每次调用 getView 方法时我都不能保证我的 editTexts 会被正确填充而且我没有意识到这一点。因此,我进行的每次 getView 调用都会设置 editText 值,如果用户编辑 ET 值,我将其存储在 HashMap 中以在 getView 中恢复,如果给定 editText 在 HashMap 中没有条目,那么我将其设置为默认值值(零):

    ...
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;

最佳答案

以色列,

查看您的代码后,我想知道您做出的实现决定。由于每个 Button 都“绑定(bind)”到特定的 EditText,您是否考虑过将那些 ButtonsTag 设置为 EditText? Tag 可以是任何包含 UI 元素的 Object。这对于动态 UI 元素特别有用,例如运行时填充的列表。

因为这是在您的 Adapter 中处理的,所以您不必担心重复的 Parents 等。此外,您可以避免担心在 onClick() 中“找到”控件,因为您会拥有它(它是标记)。我不确定您的项目到底需要什么,但这似乎是一个潜在可行的解决方案,除非您需要那些 Buttons 来完成其他任务。

注意事项只需确保在完成后删除标签对 EditText 的引用。否则,您将面临泄漏一些内存的风险。

模糊逻辑

关于android - ListView 中的重复布局引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7772468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com