首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我们可以从适配器调用startActivityForResult吗?如何获取响应?

我们可以从适配器调用startActivityForResult吗?如何获取响应?
EN

Stack Overflow用户
提问于 2013-11-16 15:25:18
回答 4查看 40.3K关注 0票数 36

在适配器中可以有方法startActivtyForResult吗?那么如何获得响应呢?在哪里执行回调函数?

EN

回答 4

Stack Overflow用户

发布于 2013-11-16 15:32:47

是的,这是可能的。您需要在适配器中引用Context并调用该活动:

代码语言:javascript
复制
Intent intent = new Intent(context, TargetActivity.class);
((Activity) context).startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);

请注意,上下文必须是活动上下文,否则此代码将失败。

您可以像往常一样使用onActivityResult在封闭的活动中获得结果。

所以,举个例子:

在您的适配器中:

代码语言:javascript
复制
MyAdapter(Context context) {
    mContext = context;
}

public View getView(int position, View convertView, ViewGroup parent) {
    …
    open.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            …
            Activity origin = (Activity)mContext;
            origin.startActivityForResult(new Intent(mContext, SecondActivity.class), requestCode);
        }   
    });
    …
}

public  void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("MyAdapter", "onActivityResult");
}

在第二个练习中,像往常一样使用setResultfinish

在主活动中,捕获结果并将其传递给适配器回调:

代码语言:javascript
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    mAdapter.onActivityResult(requestCode, resultCode, data);
}
票数 71
EN

Stack Overflow用户

发布于 2017-02-17 19:23:40

Yes.You可以从适配器调用startactivityforresult()。

有两种情况-1.从activity调用适配器和在activity中需要onActivityResult。2.从片段中调用适配器,需要片段中的onActivityResult。

案例1:在Activity中获取OnActivityResult,然后将activity的引用传递给适配器构造函数

代码语言:javascript
复制
public MyAdapter(Activity pActivity, List<MyBean> pList) {
        mList = pList;
        mActivity = pActivity;       
    }

现在是startActivityForResult

代码语言:javascript
复制
Intent intent = new Intent(context, TargetActivity.class);
mActivity.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);

案例2:在片段中获取OnActivityResult,然后将片段的引用传递给适配器构造函数

代码语言:javascript
复制
 public MyGamesAdapter(Fragment pContext, List<MyBean> pList,) {
        mList = pList;
        mMyFragment =pContext;
    }

 Intent intent = new Intent(context, TargetActivity.class);
    mMyFragment.startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);

现在,在activity或fragment中重写OnActivityResult并获取结果。

代码语言:javascript
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    mAdapter.onActivityResult(requestCode, resultCode, data);
}
票数 10
EN

Stack Overflow用户

发布于 2020-10-03 15:45:50

我使用了一种更简单的方法。在您的activity/fragment中创建一个公共函数,它将调用activity以获取结果

代码语言:javascript
复制
public void startActivityFromAdapter(String Arguments){
    //todo: add steps you would like to compute
    startActivityForResult(Intent, REQ_CODE);
}

在创建适配器时,将当前活动/片段作为参数传递。我将以activity为例

代码语言:javascript
复制
public MyAdaper(Activity activity, ArrayList<String> list){
    this.activity = activity;
    this.list = list;
}

通过将活动强制转换为activity类,从viewholder调用公共函数

代码语言:javascript
复制
 @Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    
    holder.applyBt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ((ActivityName) activity).startActivityFromAdapter(list.get(position).code);
        }
    });
}

并在您的调用活动/片段中使用onActivityResult

编辑:

我不推荐使用上面的方法,因为它限制适配器只能在一个活动中使用。更好的做法是,您必须使用一个接口来实现相同的功能

创建接口和onClickFunction

代码语言:javascript
复制
public interface AdapterInteface{
    void onBtClick(int Position)
}

现在,当您创建适配器时,接受此接口作为参数,并在单击按钮时调用函数

代码语言:javascript
复制
public MyAdaper(Activity activity, ArrayList<String> list, AdapterInterface adapterInterface){
    this.activity = activity;
    this.list = list;
    this.adapterInterface = adapterInterface
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    
    holder.applyBt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            adapterInterface.onBtClicked(position)
        }
    });
}

在您的活动/片段上实现此接口,并将活动/片段上的函数onBtClicked重写为startActivityForResult

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20015950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档