2016-05-03 2 views
1

Я рассмотрел большинство ответов здесь и не могу найти что-то, что работает для меня.FragmentPagerAdapter getItem(), отображающий позицию 1 вместо 0

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

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю на один элемент, вместо него отображается элемент NEXT. Я запускал его с отладкой, и он называет текущую позицию, а затем следующую позицию. Однако сначала он показывает следующую позицию, а не первую? Любая идея, что я делаю неправильно?

Код для метода 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; 
} 

EDIT вот код для активных потоков при нажатии на пункт

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

} 

Посмотрите на showSelec tedItemOnPosition, вот где я загружаю PostPagerActivity OnClick. Есть идеи?

EDIT Из моего журнала кошки

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 

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

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

+0

Привет, пожалуйста, укажите код 'ActiveThreads' - так это то, где вы говорите, что вы звоните. «pagerActivity» - мы можем проверить код, чтобы выяснить, почему он ведет себя так, как вы говорите. – ishmaelMakitla

+0

@ishmaelMakitla done – BilalMH

+0

Пожалуйста, добавьте оператор журнала в 'showItemSelectedAtPosition (int position)', чтобы показать, что такое значение 'position'. Подтвердите, что это так, как вы ожидаете - например, выбирает элемент в первой позиции, показывающий значение '1' для' position'? Это может пролить свет на это. – ishmaelMakitla

ответ

0

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

+0

Он получает нужный объект, затем получает второй объект, и это то, что проходит через – BilalMH

+0

, но это нормальное поведение. Загружается текущий и следующий фрагменты, но в двух разных вызовах getItem. Обычно Android дважды вызывал getItem, вы должны проверить это с помощью logcat. Я думаю, что ваша реализация неверна. Возможно, использование глобальных членов - это то, что развращает ваше создание фрагмента. Более чистым способом является использование нового класса в качестве адаптера вместо использования внутреннего класса. – ChampS

+0

Хорошо, как мне обойти эту проблему? – BilalMH