如何从适配器设置 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 以及是否还有其他我遗漏的内容?
- ListFragment 中的onActivityResult 没有触发,因为startActivityForResult 是从ListAdapter 调用的!我该如何处理?
- 如果有机会更新列表,如何在 MainActivity 中获取适配器和 ListFragment?
除了在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()
如果有一天你遇到这样的问题,我希望这对你也有用
我知道有几个相关主题,但我都试过了,但没有任何反应。我有一个 "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 以及是否还有其他我遗漏的内容?
- ListFragment 中的onActivityResult 没有触发,因为startActivityForResult 是从ListAdapter 调用的!我该如何处理?
- 如果有机会更新列表,如何在 MainActivity 中获取适配器和 ListFragment?
除了在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()
如果有一天你遇到这样的问题,我希望这对你也有用