【问题标题】:can we call startActivityForResult from adapter?我们可以从适配器调用 startActivityForResult 吗?
【发布时间】:2012-08-09 11:57:34
【问题描述】:

是否可以在adapter 中使用方法onActivityResume 并调用startActivityForResult

【问题讨论】:

  • 是的,你确定在 Adapter 中使用 startActivityForResult
  • 我有一个从适配器获取内容的列表视图。我在适配器中有一个按钮,单击按钮后,另一个活动将启动并返回一些东西
  • stackoverflow.com/questions/2497205/… 它是一个与您的问题相同的完整示例。我认为它很有帮助..祝您一切顺利

标签: android adapter


【解决方案1】:

是的。只需在适配器的构造函数(此处存储为 mContext)中将活动的上下文传递给适配器。 在 getView 中,只需调用

((Activity) mContext).startActivityForResult(intent,REQUEST_FOR_ACTIVITY_CODE);

【讨论】:

  • 谢谢@user936414。
  • 我们如何确定这里的上下文总是一个Activity的实例?
  • @Asakura 正如答案“只需在适配器的构造函数中将活动的上下文传递给适配器”中所述 - 您需要传递活动的上下文
  • 但是如果我们想在 Fragment 而不是 Activity 中获取 onActivityResult 怎么办?
【解决方案2】:

不一定要在适配器的构造函数中传递上下文。您可以从父 ViewGroup 获取上下文。 RecyclerView 适配器示例:

 Context mContext;
 @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mContext = parent.getContext();
        ...
    }

ListView BaseAdapter 示例

 Context mContext;
 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        mContext = parent.getContext();
        ...
}

随心所欲地使用它

((Activity) mContext).startActivityForResult(intent, REQUEST_FOR_ACTIVITY_CODE);

【讨论】:

  • Context没有startActivityForResult?为此,您需要一个 Activity。
  • 您可以为此将 mContext 转换为 Activity:((Activity) mContext)
  • 我刚刚发现使用这种方法的一个问题是,如果您在片段中接收结果,它将不会被传递。即使你调用 super.onActivityResult(requestCode, resultCode, data);在您的活动中,它似乎没有将结果传递给您的片段。在这里进一步阅读:stackoverflow.com/questions/6147884/… 我发现你必须在没有任何活动的情况下调用 startActivityForResult。想法?
  • 因为在这种情况下,您从 Activity 调用 startActivityForResult()。如果您需要在 Fragment 中接收结果,您需要从 Fragment 调用startActivityForResult()
  • 但是如果我们想像这种情况下在 Fragment 中调用 onActivityResult 怎么办? stackoverflow.com/questions/54685955/…
【解决方案3】:

校外...

((Activity) context).startActivityForResult(intent, 911);

注意!!

仅将 MyActivity.this 从活动传递到适配器作为上下文。

只通过getActivity();从片段到适配器作为上下文。

【讨论】:

    【解决方案4】:
    //First Do
    public Activity context;
    public int REQUEST_CODE = 111;
    
    public Adapter(Activity context, Data data) {
        this.context = context;
    }
    
    ///Second Do
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, NextActivity.class);
                context.startActivityForResult(intent, REQUEST_CODE);
            }
        });
    }
    

    如果您遵循此代码,则无需每次都编写它 - ((Activity) context) - 之前 - .startActivityForResult(intent, REQUEST_CODE); - 当你在 Adapter 中使用 startActivityForResult 时。

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
    • 如果我想将 Activity onActivityResult 结果的结果返回到同一个 Adapter 位置,以更新 UI (onBindViewHolder),我需要做什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多