自定义RecyclerAdapter和startActivityForResult

我有一个包含RecyclerViewFragment ,它使用自定义的RecyclerAdapter 。 我在自定义的RecyclerAdapter有一个onClickListener – 当点击一个位置时我希望它启动startActivityForResult 。 到目前为止,这样可以在单击它时根据需要启动Activity。 但是,当我按下后退按钮转到包含RecyclerViewFragmentonActivityResult永远不会被调用。 我已将上下文传递给自定义RecyclerAdapter 。 这是可能的吗? 或者,Activity / Fragment启动startActivityForResult会拦截它? 如果不是,我将最终使用手势检测器或类似的东西处理片段中的onClick,但在此之前我想给这个公平的裂缝! 注意:我在MainActivity包含onActivityResult ,它包含Fragment容器,因此如果从Fragment启动startActivityForResultFragment会接收onActivityResult 。 我的代码:

RecyclerAdapter onClickListener:

 @Override public void onClick(View v) { String titleId = titlesListDataArrayList.get(getLayoutPosition()).getTitle_id(); Intent intent = new Intent(context, CreateItemsActivity.class); intent.putExtra("TITLE_ID", titleId); ((Activity) context).startActivityForResult(intent, Constants.NEW_ITEMS_REQUEST_CODE); } 

CreateItemsActivity.class – onBackPressed()

  @Override public void onBackPressed() { Intent intent = new Intent(); setResult(Constants.NEW_ITEMS_REQUEST_CODE, intent); finish(); } 

MyListsFragment.class(包含RecyclerView)

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.e("CALLED", "OnActivity Result"); // if requestCode matches from CreateItemsActivity if (requestCode == Constants.NEW_ITEMS_REQUEST_CODE) { Log.e("REQUEST CODE", String.valueOf(requestCode)); populateRecyclerView(); } } 

另外我在MainActivity中有这个:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // included to allow fragment to receive onActivityResult } 

好的,所以如果有人在这里遇到这个问题就是我的

解。 我将此代码添加到MainActivity onActivityResult中(注意我有一个框架容器,这是所有碎片都膨胀的地方):

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // get current fragment in container Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frameContainer); fragment.onActivityResult(requestCode, resultCode, data); } 

我相信这是有效的,因为MainActivity在层次结构中排名第一,并拦截onActivityResult,所以基本上我只是将它指向我希望它被使用的位置。

只有在第二个活动完成并且执行了setResult时,才会调用您的调用活动onActivityResult

由于用户正在按下后退按钮,因此第二个活动正在完成,而不会调用setResult

您需要覆盖onBackPressed以便执行setResult代码。

我看到你已经实现了这个,但我认为问题的关键在于你需要返回Activity.RESULT_OK 而不是你的请求代码。

 @Override public void onBackPressed() { Intent intent = new Intent(); setResult(RESULT_OK, intent); super.onBackPressed(); } 

在这种情况下,您不需要显式返回Constants.NEW_ITEMS_REQUEST_CODErequestCode ,因为Android会自动转发它。