如何在适配器中启动活动?

我有一个带有自定义适配器的 ListActivity,在每个视图中,它可能有一些按钮,我需要在其中实现 OnClickListener。我需要在适配器中实现 OnClickListener。但是,我不知道如何调用像 startActivity()setResult()这样的函数。因为适配器没有扩展到 Activity。

那么,解决这个问题的最佳方法是什么呢?

谢谢。

125732 次浏览

只需将当前 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(...);
}
});
}
}

在实现 onClickListener时,可以使用 v.getContext.startActivity

btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
}
});
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);
}
});
}
}

从适配器到活动的回调可以使用接口形式的注册侦听器来完成: 制作一个界面:

      public MyInterface{
public void  yourmethod(//incase needs parameters );
}

在 Adapter 中让我们说 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");
}

//做到这一点,你需要解雇听众 我

          try {
listener . yourmethod ();
} catch (ClassCastException exception) {
// do something
}


In Activity Implement your method:




MyActivity extends AppCompatActivity implements MyInterface{


yourmethod(){
//do whatever you want
}
}

对于新版本的 sdk,您必须设置标志活动任务。

public void onClick(View v)
{
Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class);
myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(myactivity);
}

如果希望在 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);
}
});

在 Adopter 的按钮 onClickListener 中启动活动的简单方法:

Intent myIntent = new Intent(view.getContext(),Event_Member_list.class);                    myIntent.putExtra("intVariableName", eventsList.get(position).getEvent_id());
view.getContext().startActivity(myIntent);

第一个解决方案:

您可以在适配器中调用 start 活动,如下所示:

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(...);
});

这个 链接对你很有用。

view.getContext().startActivity(intent);

视图 -public void onClick(View view)图像的 OnClick