下午好,
所以我有一个带有自定义适配器的自定义ListView,该适配器的每一行都有一个复选框。在我的getView中,我为我的复选框实现了setOnCheckedChangeListener和onCheckedChanged处理程序。
现在,问题是:
每当我检查/取消选中列表中的一个项目时,我想用我想要的值更新外部TextView(假设每个项目都有相关价格,所以我想在列表下方显示总价格)
我该如何到达"外部"从适配器的getView查看?我还有其他解决方法吗?
我在自定义适配器的getView函数中留下了部分代码:
CheckBox name = (CheckBox) view.findViewById(R.id.product);
name.setText(content[i][0]);
final View v = view;
final int position = i;
name.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton group, boolean isChecked) {
setCheckedItem(position);
EditText quantity = (EditText) v.findViewById(R.id.product_quantity);
content[position][3] = quantity.getText().toString();
Iterator<String> it = getCheckedItems().values().iterator();
Double total = 0.0;
for (int i=0;i<getCheckedItems().size();i++){
Integer quantity_p = Integer.parseInt(getItem(position)[3]);
Double price = Double.parseDouble(getItem(position)[2]);
total += quantity_p*price;
}
TextView total_price = (TextView) findViewById(R.id.total_products_price);
total_price.setText(total.toString());
}
});
请注意最后两行:我知道我无法调用findViewById,但我现在还不知道该怎么做。任何建议都会很好,谢谢。
答案 0 :(得分:2)
将适配器类放在activity类中。
在主要活动类中声明TextView total_price
那么
total_price = (TextView) findViewById(R.id.total_products_price);
在你的创作中。
然后,您可以访问total_price
内的onCheckedChanged
。试试这个,它可能有用。
答案 1 :(得分:1)
您可以将TextView
传递给构造函数中的适配器。在此之后,您可以拥有一个private static
类来实现CompoundButton.OnCheckedChangedListener
,如下所示:
private static class MyOnCheckedChangedListener
implements CompoundButton.OnCheckedChangedListener {
TextView myView;
public MyOnCheckedChangedListener (TextView viewToChange) {
myView = viewToChange;
}
@Override
public void onCheckedChanged(CompoundButton group,
boolean isChecked) { ... }
}
此后只是setOnCheckedChangedListener
new MyOnCheckedChangedListener (myTextView)
(您传递给Adapter
的那个),您已准备好了。
答案 2 :(得分:0)
我可以这样做:
您可以将textview引用传递给适配器构造函数,并使用它来更改其值。
但好的方法是在您的活动和回调方法更新textview中实现interface
。对于构造函数中的适配器传递活动引用,并使用其引用来调用interface
回调方法。
a)interace
为
public Interface UpdateTextviewInterface
{
void updateTextview(String value);
}
b)让您的活动实现此界面
public MainActivity extends Activity implments UpdateTextviewInterface
并覆盖该方法。
c)将活动引用传递给适配器构造函数。使用活动参考调用updateTextview
方法更新文本视图。
答案 3 :(得分:0)
这只是一个思想和理论。但是你可以在你的活动中创建一个静态方法,在那里声明要更改的TextView,并在该方法中编写用于更改文本的代码,以及您希望它更改的方式。
然后从BaseAdapter调用该静态方法。 我说静态,所以你不必创建整个类的新实例。