我有自定义适配器的ListActivity。在每个视图中,它可能有一些按钮,我需要在其中实现OnClickListener。我需要在适配器中实现OnClickListener。但是,我不知道如何调用函数如startActivity()或setResult()。因为适配器不会扩展到Activity。
那么解决这个问题的最佳方法是什么?谢谢
答案 0 :(得分:157)
只需将当前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(...);
}
});
}
}
答案 1 :(得分:47)
实施onClickListener
时,您可以使用v.getContext.startActivity
。
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.getContext().startActivity(PUT_YOUR_INTENT_HERE);
}
});
答案 2 :(得分:28)
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, goto.class);
intent.putextra("your_extra","your_class_value");
context.startActivity(intent);
}
});
}
}
答案 3 :(得分:10)
对于较新版本的sdk,您必须设置标记活动任务。
public void onClick(View v)
{
Intent myactivity = new Intent(context.getApplicationContext(), OtherActivity.class);
myactivity.addFlags(FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(myactivity);
}
答案 4 :(得分:1)
从适配器到活动的回调可以使用以接口形式注册监听器来完成: 建立一个界面:
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");
}
//在需要触发侦听器的地方执行此操作 升
try {
listener . yourmethod ();
} catch (ClassCastException exception) {
// do something
}
In Activity Implement your method:
MyActivity extends AppCompatActivity implements MyInterface{
yourmethod(){
//do whatever you want
}
}
答案 5 :(得分:1)
第一个解决方案:
您可以像这样在适配器内部调用启动活动:
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(...);
}
});
}
}
第二个解决方案:
您可以在onClickListener
类中调用按钮的YourAdapter
。请按照下列步骤操作:
创建这样的接口:
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对您可能有用。
答案 6 :(得分:0)
如果您要重定向网址而不是适配器类的活动,请使用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 :(得分:0)
在Adopter的按钮onClickListener中启动活动的简单方法:
Intent myIntent = new Intent(view.getContext(),Event_Member_list.class); myIntent.putExtra("intVariableName", eventsList.get(position).getEvent_id());
view.getContext().startActivity(myIntent);
答案 8 :(得分:0)
view.getContext().startActivity(intent);
查看 - public void onClick(View view)
OnClick
张图片。