java - 自定义 RecyclerAdapter 和 startActivityForResult

标签 java android android-fragments android-recyclerview onactivityresult

我有一个 Fragment,其中包含一个 RecyclerView,它使用自定义的 RecyclerAdapter。我的自定义 RecyclerAdapter 中有一个 onClickListener - 当单击某个位置时,我希望它启动 startActivityForResult。到目前为止,它的工作原理是,当单击它时,它会根据需要启动 Activity 。但是,当我按后退按钮转到包含 RecyclerViewFragment 时,永远不会调用 onActivityResult 。我已将上下文传递给自定义 RecyclerAdapter。这是可能的事吗?或者启动 startActivityForResult 的 Activity/Fragment 是否是拦截它的那个?如果不是,我最终将使用手势检测器或类似的东西来处理 fragment 中的 onClick,但在此之前我想给它一个公平的破解!注意:我已将 onActivityResult 包含在具有 Fragment 容器的 MainActivity 中,因此 Fragment 确实会接收 onActivityResult 如果 startActivityForResult 是从 Fragment 发起的。我的代码:

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

    }

最佳答案

您的调用 Activity onActivityResult 仅当第二个 Activity 完成且 setResult 已执行时才会被调用。

由于用户点击后退按钮,第二个 Activity 将在没有调用 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 会自动转发该内容。

关于java - 自定义 RecyclerAdapter 和 startActivityForResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31010241/

相关文章:

java - Android edittext 将每行上的文本获取到一个数组中并自动换行?

java - Eclipse - 需要手动添加外部jar

android - 如何在@GET 注解中动态改变值?

android - 在 fragment 中使用 enableAutoManage()

android - 如何正确回到上一个 fragment ?

java - 如何检查文本板中的下一个空行并附加下一个输入

java - REST 服务 Controller 可以读取位于请求参数中给定路径的文本文件吗?

android - 在 fragment 之间发送数据的最佳方式是什么? ViewModel 或目标参数?

android - 如何使 Android 应用程序数据持久化?

android - 是否可以在 ListFragment 中设置自定义 ListView?