如何从适配器设置 startActivityForResult 并在 viewPager 片段中获取结果

How to set startActivityForResult from an adapter and get the result in a viewPager fragment

我知道有几个相关主题,但我都试过了,但没有任何反应。我有一个 "MainActivity" class,其中包含一个名为 "HomeFragment" 的片段,该片段包含一个带有两个片段的 viewPager,其中一个片段名为 "ListFragment"。通过设置一个名为 "ListAdapter" 的适配器,每个项目的 onClick 方法都可以正常工作,问题是当我设置时:

                intentRequestDetails.putExtra(KEY_POSITION, position);
                intentRequestDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                ((Activity) context).startActivityForResult(intentRequestDetails, 2);

到适配器中的onItemClick, 我不知道如何在 "ListFragment" 中得到结果。 我将 "getActivity()" 传递给适配器和 ListFragment,但它们都不起作用! 请帮助我在 "ListFragment"

中获得结果
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 2) {
        if (resultCode == Activity.RESULT_OK) {
            int position = data.getIntExtra("position", -1);
            userRequestsViewModel.getResult().remove(position);
            viewHolder.rView.getAdapter().notifyItemRemoved(position);
            viewHolder.rView.getAdapter().notifyItemRangeChanged(position, viewHolder.rView.getAdapter().getItemCount());

        } else if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }

我需要的 是什么作为上下文从片段传递到适配器?在哪里以及如何覆盖 onActivityResult 以及是否还有其他我遗漏的内容?

除了在fragment中覆盖onActivityResult,你还需要在activity中覆盖class:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Fragment fragment = getSupportFragmentManager().findFragmentById("yourFragment"); 
    fragment.onActivityResult(requestCode, resultCode, data); 
}

在片段中:

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   //do something
  }

经过数小时的研究,我终于解决了这个问题,如下所示: 因为我在一个 activity 中有两个嵌套片段作为子片段和父片段,我设计对每个项目采取行动,单击 recyclerView 项目并转到另一个 activity 以获取结果并刷新列表我在 MainActivity 中添加了这段代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().getFragments().get(1);
    fragment.onActivityResult(requestCode, resultCode, data);
}

将数据传递给哪个 select 目标片段 (parentFragment),然后在该 parentFragment 中添加此方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getChildFragmentManager().getFragments().get(1);
    fragment.onActivityResult(requestCode, resultCode, data);
}

将 onActivityResult 发送到子片段。毕竟在子片段中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 2){
        if (resultCode == Activity.RESULT_OK) {
            int position = data.getIntExtra("position", -1);
            userRequestsViewModel.getResult().remove(position);
            viewHolder.rView.getAdapter().notifyItemRemoved(position);
            viewHolder.rView.getAdapter().notifyItemRangeChanged(position, viewHolder.rView.getAdapter().getItemCount());
        }
    }
}

刷新 recyclerView 适配器并通知它一个项目已被删除!另一个重要的一点是,在适配器中我只是这样做了:

Intent intent = new Intent(view.getContext(), SecondActivity.class);

                intent.putExtra(KEY_POSITION, position);
                ((Activity) context).startActivityForResult(intent, 2);

并删除这行代码:

intentRequestDetails.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

当然,我将 activity 的上下文从片段传递到适配器:简单地

getContext()

如果有一天你遇到这样的问题,我希望这对你也有用