自定义RecyclerAdapter和startActivityForResult

时间:2015-06-23 18:06:20

标签: java android android-fragments android-recyclerview onactivityresult

我的Fragment包含使用自定义RecyclerView的{​​{1}}。我的自定义RecyclerAdapter中有一个onClickListener - 当点击一个位置时,我希望它开始RecyclerAdapter。到目前为止,这样可以在点击它时根据需要启动Activity。但是,当我按后退按钮转到包含startActivityForResult Fragment的{​​{1}}时,从未调用过。我已将上下文传递给自定义RecyclerView。这是可能的吗?或者,活动/片段发起onActivityResult是否会截获它?如果不是,我将最终使用手势检测器或类似的东西处理片段中的onClick,但在此之前我想给这个公平的裂缝!注意:我已在RecyclerAdapter包含startActivityForResult包含onActivityResult容器,以便MainActivity确实收到Fragment如果从Fragment启动onActivityResult startActivityForResult。我的代码:

RecyclerAdapter onClickListener:

Fragment

CreateItemsActivity.class - onBackPressed()

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

MyListsFragment.class(包含RecyclerView)

    @Override
        public void onBackPressed() {

            Intent intent = new Intent();
            setResult(Constants.NEW_ITEMS_REQUEST_CODE, intent);
            finish();
        }

我在MainActivity中也有这个:

@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();
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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

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

我发现您已经实现了这一点,但我认为问题的症结在于您需要返回Activity.RESULT_OK 而不是您的请求代码。

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

   super.onBackPressed();
}

在这种情况下,您不需要明确返回requestCode Constants.NEW_ITEMS_REQUEST_CODE因为Android会自动转发。{/ p>

答案 1 :(得分:1)

好的,所以如果有其他人在这里有这个问题,我的

溶液。我将此代码添加到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,所以基本上我只是将它指向我希望它被使用的位置。