自定义 RecyclerAdapter 和 startActivityForResult

Custom RecyclerAdapter and startActivityForResult

我有一个 Fragment,其中包含一个使用自定义 RecyclerAdapterRecyclerView。我的自定义 RecyclerAdapter 中有一个 onClickListener - 当点击一个位置时,我希望它开始 startActivityForResult。到目前为止,它的工作原理是,当它被点击时,它会根据需要启动 Activity。但是,当我按下后退按钮转到包含 RecyclerViewFragment 时,永远不会调用 onActivityResult。我已经将上下文传递给自定义 RecyclerAdapter。这是可能的吗?还是发起 startActivityForResult 的 Activity/Fragment 拦截了它?如果不是,我最终会使用手势检测器或类似的东西处理 Fragment 中的 onClick,但在此之前我想给它一个公平的破解!注意:我已将 onActivityResult 包含在具有 Fragment 容器的 MainActivity 中,因此如果 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();
        }
    }

我在主目录中也有这个Activity:

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

    }

您的调用活动 onActivityResult 只会在第二个 activity 完成并且 setResult 已执行时被调用。

由于用户按下后退按钮,第二个 activity 正在完成而没有调用 setResult

您需要覆盖 onBackPressed 才能执行您的 setResult 代码。

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

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

   super.onBackPressed();
}

在这种情况下,您不需要明确地 return 您的 requestCodeConstants.NEW_ITEMS_REQUEST_CODE 因为 Android 会自动转发。

好的,所以如果其他人遇到这个问题,我的

解决方案。我将此代码添加到 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,所以基本上我只是将它指向我想要使用它的地方。