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

时间:2018-11-11 12:11:19

标签: android android-fragments android-adapter startactivityforresult

我知道有几个相关主题,但是我都尝试了所有相关主题,但没有任何反应。我有一个“ MainActivity”类,其中包含一个名为“ 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,以及是否还有其他我想念的东西?

  • 由于从ListAdapter调用了startActivityForResult,因此不会触发ListFragment中的onActivityResult!我应该如何处理?
  • 如果有机会更新列表,如何在MainActivity中获取适配器和ListFragment?

2 个答案:

答案 0 :(得分:0)

除了在片段中覆盖onActivityResult外,您还需要在活动类中覆盖它:

@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
  }

答案 1 :(得分:0)

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

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

选择要向其传递数据的目标片段(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);

当然,我将活动上下文从片段传递到适配器:

getContext()

如果您有一天要解决这样的问题,我希望这对您也有用