如何访问适配器类中的 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