Viewpager привязывается к неправильной странице после съемки фотографии

В настоящее время я использую реализацию Viewpager в моем приложении для Android. В каждом фрагменте есть кнопка, которая делает фотографию и загружает ее в онлайн-базу данных. Однако из-за новых требований к разрешениям мне нужно было запросить разрешение. Следовательно, мне нужно будет использовать onRequestPermissionsResult(), чтобы продолжить загрузку.

Ниже моя реализация

это из ViewPager.class (поскольку после предоставления разрешения этот метод в Viewpager вызывается вместо метода во фрагменте)

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_TAKE_PHOTO:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //Permission granted to write and read file
                //Get the current fragment
                List<Fragment> fragments = getSupportFragmentManager().getFragments();
                for (Fragment currFragment : fragments) {
                    if (currFragment != null)
                        currFragment.onRequestPermissionsResult(
                                REQUEST_TAKE_PHOTO
                                , permissions
                                , grantResults);
                }
            }
            return;
        default: //Do nothing
            return;
    }
}

это из самого фрагмента

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_TAKE_PHOTO:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //Permission granted to write and read file
                uploadImage();
            }
            return;
        default: //Do nothing
            return;
    }
}

эта часть

List<Fragment> fragments = getSupportFragmentManager().getFragments();
                    for (Fragment currFragment : fragments) {
                        if (currFragment != null)
                            currFragment.onRequestPermissionsResult(
                                    REQUEST_TAKE_PHOTO
                                    , permissions
                                    , grantResults);
                    }

моя попытка найти правильный фрагмент, который нажал кнопку и вызвать метод OnRequestPermissionResult().

Тем не менее, я замечаю это странное поведение от Viewpager. Я реализовал это так, что я щелкаю по Viewholder из RecyclerView, после чего он попадает в эту позицию в ViewPager.

Странное поведение в том, что, например, я вошел на страницу 2 из RecyclerView. Затем проведите пальцем по странице 4 и нажмите кнопку загрузки фотографии, после того как фотография будет готова (через встроенное приложение камеры), она вернется на страницу 2.

Это почему? Как мне это исправить? Извините за длинный пост. Просто пытаюсь получить как можно больше информации. Спасибо

РЕДАКТИРОВАТЬ: Это, как я называю requestPermission

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        return;
    }
    if (requestCode == REQUEST_TAKE_PHOTO) {
        //Request for permission to access file
        if (ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            //ask for permission
            ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_TAKE_PHOTO);
        } else {
            uploadImage();
        }
    }
}

Что-то не так?

Редактировать сообщение: это та часть, где я вызвал notifyDataSetChange()

private void loadData() {
    mRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList<RouteInstructions> mList2 = new ArrayList<RouteInstructions>();

            for (DataSnapshot instructions : dataSnapshot.getChildren()) {
                mList2.add(instructions.getValue(RouteInstructions.class));
            }
            mList = mList2;
            mAdapter.notifyDataSetChanged();
            mPager.setCurrentItem(getIntent().getIntExtra(EXTRA_INDEX, 0));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

1 ответ

Решение

Я нашел ошибку. По сути, я допустил ошибку, поместив метод loadData() в метод onResume(), и, следовательно, установил страницу Viewpager обратно на ту, которую он получил от этого Extra.

Другие вопросы по тегам