2016-05-03 7 views
1

Ich habe einen Blick auf die Mehrheit der Antworten hier und kann nicht finden, was für mich funktioniert.FragmentPagerAdapter getItem() zeigt Position 1 statt 0 an

Ich habe ein Fragment namens ActiveThreads Ich möchte, dass, wann immer der Benutzer auf ein Element auf dieser Seite klickt lädt eine PagerActivity, die eine FragmentPagerActivity verwendet, wo der Benutzer blättern kann.

Das Problem, das ich habe, ist, dass, wenn ich auf ein Element klicke, es stattdessen das nächste Element zeigt. Ich habe es mit Debug durchlaufen und es ruft die aktuelle Position und dann die nächste Position auf. Aber es zeigt die nächste Position zuerst und nicht die erste? Irgendeine Idee, was ich falsch mache?

-Code für PostPager Aktivität der getItem Methode

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

und hier in 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 hier meine neue Instanz ist der Code für aktive Threads, wenn ich auf einem Element drücken

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

} 

Schauen Sie sich die ShowSelec an tedItemOnPosition-Methode, hier lade ich die PostPagerActivity OnClick. Irgendwelche Ideen?

EDIT Aus meiner log Katze

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 

können Sie die ID Änderungen sehen? Es zeigt die mit der zweiten ID verbundenen Elemente an! :(

Vielen Dank im Voraus

+0

Hallo, geben Sie bitte den Code für 'ActiveThreads' - denn dies ist, wo Sie sagen, dass Sie anrufen. die 'pagerActivity' - wir können den Code untersuchen, um herauszufinden, warum er sich so verhält, wie Sie es nennen. – ishmaelMakitla

+0

@ishmaelMakitla done – BilalMH

+0

Fügen Sie die Log-Anweisung in der' showItemSelectedAtPosition (int position) 'hinzu, um den Wert von' position' anzuzeigen. Bestätigen Sie, ob dies so ist, wie Sie es erwarten - zum Beispiel, wenn Sie das Element an der ersten Position auswählen, das den Wert von "1" für "Position" zeigt? Dies könnte Licht ins Dunkel bringen. – ishmaelMakitla

Antwort

0

Es scheint Ihre mThreadItems.get (Position), das falsche Objekt zurückgibt

+0

Es bekommt das richtige Objekt und bekommt dann das zweite Objekt und das wird durch – BilalMH

+0

übergeben, aber das ist ein normales Verhalten. Das aktuelle und das nächste Fragment werden geladen, aber in zwei verschiedenen getItem-Aufrufen. Normalerweise würde Android getItem zweimal aufrufen, das sollten Sie mit logcat überprüfen. Ich denke, Ihre Implementierung ist falsch. Vielleicht ist die Verwendung von globalen Membern das, was Ihre Fragment-Erstellung verfälscht. Eine sauberere Methode besteht darin, eine neue Klasse als Adapter zu verwenden, anstatt eine innere Klasse zu verwenden. – ChampS

+0

Ok, wie würde ich dieses Problem umgehen? – BilalMH

Verwandte Themen