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

Posted

技术标签:

【中文标题】如何访问适配器类中的 Activity 对象【英文标题】:How to access Activity object in Adapter class 【发布时间】:2016-02-27 21:01:27 【问题描述】:

如何访问基适配器类中的活动对象。我使用适配器类作为我的列表视图的适配器。我想访问列表视图之外的文本视图,但列表视图和文本视图处于相同的活动中。我在这样的适配器类中尝试过:

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

但是这个语法会出错:

ShopCartActivity. //ERROR

我也试过这样:

ShopCartActivity.this or ShopCartActivity.class

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

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

【问题讨论】:

将上下文传递给适配器类构造函数。然后像这样使用上下文context.findViewById(R.id.txtGrandTotal); 我在构造函数中传递了上下文,但没有在 getView 方法中工作 【参考方案1】:

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

使用抽象类的示例代码:

public abstract class AdapterHandler

    public void updateText(String text) 

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

public AdapterHandler adapterhandler;

然后在Activity设置handler,在你初始化适配器之后:

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

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

【讨论】:

有点困惑解释更多! this.adapterhandler != null 如果我将它放在 getView() 内的 click 方法中,则变为 null ? 在初始化和设置适配器的活动中发布代码。你一定是做错了什么。 哦等等,这可能不是问题所在。在 click 方法中,您必须像 AdapterClassName.this.adapterhandler 一样执行此操作(请参阅上面的答案,与我在 updateText 在 Activity 中覆盖所做的方式相同) 我试过了,但仍然出错,无论如何我找到了下面的简短解决方案,谢谢【参考方案2】:

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

Adapter adapter = new Adapter(this);

然后在 Adpater 类构造函数中:

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

【讨论】:

感谢您的方法简短而简单 永远不要将上下文传递给适配器。这是内存泄漏。 在适配器类中保持上下文不会导致内存泄漏。为了澄清检查这个帖子的答案***.com/questions/9037370/…【参考方案3】:

如果你有来自 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!");

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何访问适配器类中的 Activity 对象的主要内容,如果未能解决你的问题,请参考以下文章

从适配器中的片段调用元素

如何将值从基本适配器传递到 Android 中的 Activity

结构性模式-适配器模式

如何从android中的自定义适配器调用Activity asynctask

适配器类中的super.onActivityResult?安卓

如何在适配器类中的列表视图项上获取动画?