Android从适配器自定义类调用findViewById

时间:2014-11-04 11:51:04

标签: android listview adapter findviewbyid

下午好,

所以我有一个带有自定义适配器的自定义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,但我现在还不知道该怎么做。任何建议都会很好,谢谢。

4 个答案:

答案 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)

我可以这样做:

  1. 您可以将textview引用传递给适配器构造函数,并使用它来更改其值。

  2. 但好的方法是在您的活动和回调方法更新textview中实现interface。对于构造函数中的适配器传递活动引用,并使用其引用来调用interface回调方法。

  3. a)interace

    public Interface UpdateTextviewInterface { void updateTextview(String value); }

    b)让您的活动实现此界面

    public MainActivity extends Activity implments UpdateTextviewInterface

    并覆盖该方法。

    c)将活动引用传递给适配器构造函数。使用活动参考调用updateTextview方法更新文本视图。

答案 3 :(得分:0)

这只是一个思想和理论。但是你可以在你的活动中创建一个静态方法,在那里声明要更改的TextView,并在该方法中编写用于更改文本的代码,以及您希望它更改的方式。

然后从BaseAdapter调用该静态方法。 我说静态,所以你不必创建整个类的新实例。