如何在适配器中启动 Activity?
Posted
技术标签:
【中文标题】如何在适配器中启动 Activity?【英文标题】:How to start Activity in adapter? 【发布时间】:2011-05-10 23:23:16 【问题描述】:我有一个带有自定义适配器的 ListActivity,在每个视图中,它可能有一些按钮,我需要在其中实现 OnClickListener
。我需要在适配器中实现OnClickListener
。但是,我不知道如何调用像startActivity()
或setResult()
这样的函数。由于适配器没有扩展到 Activity。
那么解决这个问题的最佳方法是什么?
谢谢。
【问题讨论】:
【参考方案1】:只需将当前 Context 传递给 Adapter 构造函数并将其存储为字段即可。然后在 onClick 中,您可以使用该上下文调用 startActivity()。
伪代码
public class MyAdapter extends Adapter
private Context context;
public MyAdapter(Context context)
this.context = context;
public View getView(...)
View v;
v.setOnClickListener(new OnClickListener()
void onClick()
context.startActivity(...);
);
【讨论】:
还有一个问题,如果我需要调用 setResult 怎么办?因为我需要在我的活动中调用 onActivityResult(...) 函数。感谢您的帮助。 如果要从子Activity返回一些结果,需要用startActivityForResult而不是StartActivity启动Activity,并覆盖onActivityResult(子Activity结束后调用)。 @RobbyPond 上下文没有 startActivityForResult() ! developer.android.com/reference/android/content/Context.html 你可以这样转换上下文:((Activity) context).startActivityForResults(intent,0); 有没有办法 putExtra 和 Finish() 当前活动?【参考方案2】:实现onClickListener
时,可以使用v.getContext.startActivity
。
btn.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
);
【讨论】:
还有一个问题,如果我需要调用 setResult 怎么办?因为我需要在我的活动中调用 onActivityResult(...) 函数。感谢您的帮助。【参考方案3】:public class MyAdapter extends Adapter
private Context context;
public MyAdapter(Context context)
this.context = context;
public View getView(...)
View v;
v.setOnClickListener(new OnClickListener()
void onClick()
Intent intent= new Intent(context, ToActivity.class);
intent.putExtra("your_extra","your_class_value");
context.startActivity(intent);
);
【讨论】:
一个旧线程,但添加了新的搜索结果:来自适配器的这个回调违背了设计模式,因为应该在活动侦听器中创建和执行 Intent,最适合这个用例。【参考方案4】:从适配器到活动的回调可以通过以接口的形式注册监听器来完成: 制作接口:
public MyInterface
public void yourmethod(//incase needs parameters );
在适配器中假设是 MyAdapter:
public MyAdapter extends BaseAdapter
private MyInterface listener;
MyAdapter(Context context)
try
this. listener = (( MyInterface ) context);
catch (ClassCastException e)
throw new ClassCastException("Activity must implement MyInterface");
//在你需要触发监听器的地方执行此操作 l
try
listener . yourmethod ();
catch (ClassCastException exception)
// do something
In Activity Implement your method:
MyActivity extends AppCompatActivity implements MyInterface
yourmethod()
//do whatever you want
【讨论】:
【参考方案5】:对于较新版本的 sdk,您必须设置标记活动任务。
public void onClick(View v)
Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class);
myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(myactivity);
【讨论】:
这是真正的答案,因为: context.getApplicationContext().startActivity(myactivity);如果您单独使用 context.startActivity(intent) 它将不起作用!只需以这种方式为 android 上的 kotlin 解决问题【参考方案6】:如果您想重定向 url 而不是来自适配器类的活动,则 使用 startactivity 传递上下文。
btnInstall.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent intent=new Intent(Intent.ACTION_VIEW, Uri.parse(link));
intent.setData(Uri.parse(link));
context.startActivity(intent);
);
【讨论】:
【参考方案7】:在 Adopter 的按钮 onClickListener 中启动 Activity 的简单方法:
Intent myIntent = new Intent(view.getContext(),Event_Member_list.class); myIntent.putExtra("intVariableName", eventsList.get(position).getEvent_id());
view.getContext().startActivity(myIntent);
【讨论】:
【参考方案8】:第一个解决方案:
您可以像这样在适配器内部调用启动活动:
public class YourAdapter extends Adapter
private Context context;
public YourAdapter(Context context)
this.context = context;
public View getView(...)
View v;
v.setOnClickListener(new OnClickListener()
void onClick()
context.startActivity(...);
);
第二种解决方案:
您可以从YourAdapter
类中调用按钮的onClickListener
。请按以下步骤操作:
创建一个这样的界面:
public YourInterface
public void yourMethod(args...);
然后在你的适配器里面:
public YourAdapter extends BaseAdapter
private YourInterface listener;
public YourAdapter (Context context, YourInterface listener)
this.listener = listener;
this.context = context;
public View getView(...)
View v;
v.setOnClickListener(new OnClickListener()
void onClick()
listener.yourMethod(args);
);
你启动你的适配器的地方是这样的:
YourAdapter adapter = new YourAdapter(getContext(), (args) ->
startActivity(...);
);
这个link可能对你有用。
【讨论】:
【参考方案9】:view.getContext().startActivity(intent);
查看 - public void onClick(View view)
OnClick
图片。
【讨论】:
以上是关于如何在适配器中启动 Activity?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin 中使用与 Activity 和 Fragment 相同的 RecyclerView 适配器?
如何将值从基本适配器传递到 Android 中的 Activity