FragmentPagerAdapter getItem() отображает позицию 1 вместо 0

Я просмотрел большинство ответов здесь и не могу найти что-то, что работает для меня.

У меня есть фрагмент с именем ActiveThreads. Я хочу, чтобы всякий раз, когда пользователь щелкает элемент на этой странице, он загружал pagerActivity, который использует FragmentPagerActivity, где пользователь может прокручивать.

У меня проблема в том, что когда я нажимаю на один элемент, вместо этого отображается СЛЕДУЮЩИЙ элемент. Я прогнал его с отладкой, и он вызывает текущую позицию, а затем следующую позицию. Однако он сначала показывает следующую позицию, а не первую? Любая идея, что я делаю неправильно?

Код для метода getItem PostPager Activity

private void populateUIWithData() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    mViewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
        @Override
        public Fragment getItem(int position) {
            if (mThreadItems != null){
                mThreads = mThreadItems.get(position);
                mFragment = PostFragment.newInstance(mThreads.getId(), mThreads.getTopic_name(),
                        mThreads.getName(), mThreads.getNum_posts());
                mViewPager.getCurrentItem();
            }
            return mFragment;
        }

        @Override
        public int getCount() {
            return mThreadItems.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            if (object != null) {
                return ((Fragment) object).getView() == view;
            } else {
                return false;
            }
        }
    });
}

и вот мой новый экземпляр в PostFragment

public static PostFragment newInstance(String threadID, String topicName, String threadName, String postCount) {
    mThreadID = threadID;
    mTopicName = topicName;
    mThreadName = threadName;
    mPostCount = postCount;

    Bundle args = new Bundle();
    args.putSerializable("threadID", threadID);
    args.putSerializable("topicName", topicName);
    args.putSerializable("threadName", threadName);
    args.putSerializable("postCount", postCount);

    mCurrentFragment = new PostFragment();

    mCurrentFragment.setArguments(args);

    return mCurrentFragment;
}

ИЗМЕНИТЬ вот код для активных потоков, когда я нажимаю на элемент

   private void initUI() {
    mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.threadRecyclerView);
    mLayoutManager = new GridLayoutManager(getActivity(), 1);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mSwipeRefreshLayout = (SwipeRefreshLayout) mRootView.findViewById(R.id.swipeForNewThreads);
    mSwipeRefreshLayout.setColorSchemeResources(R.color.blue, R.color.green, R.color.yellow, R.color.red);

    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            loadNewData();
        }
    });

    mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener
            (getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    showItemSelectedAtPosition(position);

                }
            }));
    loadData();

}

private void loadNewData() {

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            loadData();
            mAdapter.notifyDataSetChanged();
            mSwipeRefreshLayout.setRefreshing(false);
        }
    }, 0);

}

private void loadData() {

    mDataFactory = new ThreadFeedDataFactory(getActivity());
    mDataFactory.getActiveThreadFeed(new ThreadFeedDataFactory.ThreadFeedDataFactoryCallback() {
        @Override
        public void onThreadDataReceived(ThreadResponse response) {
            mData = response;
            populateUIWithData();

        }

        @Override
        public void onThreadDataFailed(Exception exception) {

        }
    });

}

private void populateUIWithData() {


    mAdapter = new ThreadAdapter(getActivity(), mData);
    mRecyclerView.setAdapter(mAdapter);
}

private void showItemSelectedAtPosition(int position) {
    Threads selectedThread = mData.getItem(position);

    Intent intent = new Intent(getActivity(), PostPagerActivity.class);
    intent.putExtra("Threads", Parcels.wrap(selectedThread.getThreadItem()));

    startActivity(intent);

}

Посмотрите на метод showSelectedItemOnPosition, здесь я загружаю PostPagerActivity OnClick. Любые идеи?

EDIT Из моего журнала cat

05-03 10:47:54.857 7894-7894/com.mumsnet.android E/threadItemID: 2628772
05-03 10:47:54.865 7894-7894/com.mumsnet.android E/POSTFRAG: threadItemID: 2628772
05-03 10:47:54.867 7894-7894/com.mumsnet.android E/threadItemID: 2628697
05-03 10:47:54.867 7894-7894/com.mumsnet.android E/POSTFRAG: threadItemID: 2628697
05-03 10:47:54.916 7894-7894/com.mumsnet.android E/LoadData: threadItemID: 2628697
05-03 10:47:54.925 7894-7894/com.mumsnet.android E/LoadData: threadItemID: 2628697

Вы видите изменения идентификатора? Он отображает элементы, связанные со вторым идентификатором! :(

заранее спасибо


person BilalMH    schedule 03.05.2016    source источник
comment
Привет, пожалуйста, включите код для ActiveThreads — поскольку именно здесь вы говорите, что вызываете pagerActivity — мы можем изучить код, чтобы выяснить, почему он ведет себя так, как вы говорите.   -  person ishmaelMakitla    schedule 03.05.2016
comment
@ishmaelMakitla готово   -  person BilalMH    schedule 03.05.2016
comment
Добавьте оператор журнала в showItemSelectedAtPosition(int position), чтобы показать значение position. Подтвердите, так ли это, как вы ожидаете - например, при выборе элемента в первой позиции отображается значение 1 для position? Это может пролить некоторый свет на это.   -  person ishmaelMakitla    schedule 03.05.2016
comment
@ishmaelMakitla опубликовал для вас немного моего бревенчатого кота внизу   -  person BilalMH    schedule 03.05.2016
comment
Можете ли вы попробовать что-то вроде этого: mThreads = mThreadItems.get(mViewPager.getCurrentItem()); и посмотреть, работает ли это так, как вы ожидаете.   -  person ishmaelMakitla    schedule 03.05.2016
comment
Это именно то, что я хотел сделать, спасибо! Вы хотите опубликовать это как ответ, и я проголосую за него? @ishmaelмакитла   -  person BilalMH    schedule 04.05.2016


Ответы (1)


Кажется, ваш mThreadItems.get(position); возвращает неправильный объект.

person Ben    schedule 03.05.2016
comment
Он получает правильный объект, затем получает второй объект, и это то, что передается - person BilalMH; 03.05.2016
comment
но это нормальное поведение. Текущий и следующий фрагмент загружаются, но двумя разными вызовами getItem. Обычно Android дважды вызывает getItem, вы должны проверить это с помощью logcat. Я думаю, что ваша реализация неверна. Возможно, использование глобальных членов портит создание вашего фрагмента. Более чистый способ — использовать новый класс в качестве адаптера вместо использования внутреннего класса. - person Ben; 03.05.2016
comment
Хорошо, как мне обойти эту проблему? - person BilalMH; 03.05.2016
comment
извините случайно выложил только часть сообщения, сейчас дописал остальное - person Ben; 03.05.2016