如何访问Adapter类中的Activity对象

DIG*_*EDI 1 java android listview android-listview baseadapter

如何在基本适配器类中访问活动对象.我使用适配器类作为我的列表视图的适配器.我想访问listview之外的textview,但listview和textview属于同一个活动.我试过这样的适配器类:

            holder.grandTotal = (TextView) ShopCartActivity.findViewById(R.id.txtGrandTotal);
        holder.grandTotal.setText(String.valueOf(new DecimalFormat("##.##").format(grandTotal)));
Run Code Online (Sandbox Code Playgroud)

但是这个语法出现了错误:

ShopCartActivity. //ERROR
Run Code Online (Sandbox Code Playgroud)

我也是这样试过的:

ShopCartActivity.this or ShopCartActivity.class
Run Code Online (Sandbox Code Playgroud)

我尝试在它适用的适配器类的构造函数中(但是值还没有计算)但是当我把它放在我的所有计算正在发生的getView()方法中时,它不起作用.

基本上我想在循环返回基本适配器中的值后设置textview的值.有没有办法用findviewbyid方法访问对象?

Har*_*nan 5

不应尝试从适配器中访问活动.编程很糟糕.如果要将某些值传递给Activity并在其中执行某些操作,请使用一些回调机制(抽象类或接口)将值传递给活动,然后让活动更新TextView文本.

使用抽象类的示例代码:

public abstract class AdapterHandler
{
    public void updateText(String text) {}
}
Run Code Online (Sandbox Code Playgroud)

然后在适配器中创建此类的对象:

public AdapterHandler adapterhandler;
Run Code Online (Sandbox Code Playgroud)

然后在Activity初始化适配器后设置处理程序:

adapter.adapterhandler = new AdapterHandler() {
    @Override
    public void updateText(String text) {
        ShopCartActivity.this.grandTotal.setText(text);
    }
};
Run Code Online (Sandbox Code Playgroud)

然后在适配器中,如果需要,将其称为:

if (this.adapterhandler != null) {
    this.adapterhandler.updateText(String.valueOf(new DecimalFormat("##.##").format(grandTotal)));
}
Run Code Online (Sandbox Code Playgroud)

代码相对较长,但这是正确且更具可扩展性的方法.