如何访问适配器 class 中的 Activity 对象

How to access Activity object in Adapter class

如何在基本适配器 class 中访问 activity 的对象。我使用适配器 class 作为列表视图的适配器。我想访问列表视图之外的文本视图,但列表视图和文本视图在同一 activity 中。我在适配器 class 中试过这样:

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

但此语法出现错误:

ShopCartActivity. //ERROR

我也这样试过:

ShopCartActivity.this or ShopCartActivity.class

我在适配器的构造函数中尝试了这个 class 它可以工作(但尚未计算值)但是当我将它放在 getView() 方法中时,我的所有计算都在该方法中进行,它不起作用。

基本上我想在循环 returns 基本适配器中的值后设置 textview 的值。有没有办法可以使用 findviewbyid 方法访问对象?

创建适配器时传递上下文,使用该上下文获取膨胀视图。

Adapter adapter = new Adapter(this);

然后在 Adpater Class 构造函数中:

public Adapter(Context context){
context.findViewById(R.id.textview);
}

不应该 尝试从适配器中访问 activity。这是糟糕的编程。如果你想将一些值传递给 Activity 并在其中执行一些操作,请使用一些回调机制(抽象 class 或接口)将值传递给 activity 然后让activity 更新 TextView 的文本。

使用抽象的示例代码class:

public abstract class AdapterHandler
{
    public void updateText(String text) {}
}

然后在Adapter中创建这个class的对象:

public AdapterHandler adapterhandler;

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

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

然后在适配器中,在需要的地方调用它:

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

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

如果您有来自 Activity 的上下文,您可以像这样在 ListView 之外获取 TextView 和其他视图:

// Get the rootView from the activity
final View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content);

// Get the textView from the rootView
TextView mTextView = rootView.findViewById(R.id.your_text_view);

// Do something with it
mTextView.setText("Hello my friend!");

您可以在调用构造函数时设置适配器之前发送来自 class 的任何对象,然后可以在适配器中接收这些参数。

final ChannelsAdapter channelAdapter = new ChannelsAdapter(allChannelList, SoftKeyboard.this);
channelRecyclerView.setAdapter(channelAdapter);