2

Bir ViewLager'da bir TabLayout ile tümleşik 4 Fragment var. Bu Fragments'ın her biri bir RecyclerView tutar, çünkü bilinmeyen miktarda liste öğesi görüntülüyorum. Öğeler tarihe göre yüklendi, bu nedenle gün değiştirmenize izin veren iki düğmem var ve ardından liste öğelerindeki uygun veriler, ayarlanan tarihe göre yüklenir. Düğmeler dış aktivitenin bir parçasıdır.ViewPager'daki Fragman, RecyclerView öğesinde döndürme sırasında hiçbir şey görüntülemiyor

Şimdiye kadar her şey mükemmel çalışıyor ANCAK cihazı döndürdüğümde parçalar hiçbir şey yüklemiyor. Fragmanlar içinde hiçbir şey gösterilmiyor. Dış aktivitedeki görünümler yine de iyi görüntülenir. Garip olan şu ki, tarihi değiştiren düğmelerden birine dokunursam, Fragmanlar yüklenir ve veriler doğru şekilde görüntülenir. Ama bu düğmelerden birine tıkladığımda, dönüşten hemen sonra görüntülenecek her şeye ihtiyacım var. İşte benim kodudur:

public class MainActivity extends AppCompatActivity implements DatePickerFragment.DateDialogInterface 
{ 
    private final static String COLOR_CONTROL_CHOSEN = "color_control_chosen"; 
    private static final String DIALOG_DATE = "dialog_date"; 
    private static final String TAG = "MainActivity"; 
    private static final String SET_LOCATION = "set_location"; 
    public static final String LEAGUE_POSITION = "league_position"; 
    private Toolbar mToolbar; 
    private ViewPager mViewPager; 
    private TabLayout mTabLayout; 
    private ImageButton mPrevDateButton, mNextDateButton; 
    private TextView mDateTextView, mLeagueTextView; 
    private String mTodaysDate; 
    private Date mLastSelectedDate, mTodaysDateObj; 
    private ProgressBar mProgressBar; 
    private FragmentPagerAdapter mAdapterViewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mToolbar = (Toolbar) findViewById(R.id.outnix_toolbar); 
     mViewPager = (ViewPager) findViewById(R.id.main_activity_view_pager); 
     mTabLayout = (TabLayout) findViewById(R.id.main_activity_tab_layout); 
     mDateTextView = (TextView) findViewById(R.id.display_date_text_view); 
     mLeagueTextView = (TextView) findViewById(R.id.league_title_header); 
     mPrevDateButton = (ImageButton) findViewById(R.id.previous_date_button); 
     mNextDateButton = (ImageButton) findViewById(R.id.next_date_button); 
     mProgressBar = (ProgressBar) findViewById(R.id.loading_circle); 
     mProgressBar.setVisibility(View.GONE); 
     setTodaysDate(); 
     mDateTextView.setText("Today"); 

     setSupportActionBar(mToolbar); 
     assert getSupportActionBar() != null; 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

     NavDrawerFragment navDrawerFrag = (NavDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_nav_drawer); 
     navDrawerFrag.setUp((DrawerLayout) findViewById(R.id.nav_drawer), mToolbar); 

     setUpViewPagerAdapterOnCreate(); 
     mTabLayout.setupWithViewPager(mViewPager); 

     mDateTextView.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       FragmentManager fm = getSupportFragmentManager(); 
       DatePickerFragment dialog = new DatePickerFragment(); 
       Bundle args = new Bundle(); 
       args.putSerializable("ARG_DATE", mLastSelectedDate); 
       dialog.setArguments(args); 
       dialog.show(fm, DIALOG_DATE); 
      } 
     }); 

    THESE TWO LISTENERS ARE WHAT DISPLAY THE DATA AFTER A ROTATION CHANGE 
    ////////////////////////////////////////////////////////////////// 
     mPrevDateButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       mProgressBar.setVisibility(View.VISIBLE); 
       updateDate(-1); 
       setupViewPagerAdapter(getViewPagerPos()); 
      } 
     }); 

     mNextDateButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       mProgressBar.setVisibility(View.VISIBLE); 
       updateDate(1); 
       setupViewPagerAdapter(getViewPagerPos()); 
      } 
     }); 
    } 
    //////////////////////////////////////////////////////////////////// 
/* @Override 
    protected void onResume() 
    { 
     super.onResume(); 
     setupViewPagerAdapter(getViewPagerPos()); 
    }*/ 

    private void setUpViewPagerAdapterOnCreate() //only called when opened from LauncherActivity 
    { 
     setupViewPagerAdapter(0); 

     int touchColorPixel = getIntent().getIntExtra(COLOR_CONTROL_CHOSEN, ContextCompat.getColor(this, R.color.blue)); 

     if(touchColorPixel == ContextCompat.getColor(this, R.color.orange)) 
      mViewPager.setCurrentItem(0); 
     else if(touchColorPixel == ContextCompat.getColor(this, R.color.blue)) 
      mViewPager.setCurrentItem(1); 
     else 
      mViewPager.setCurrentItem(3); 
    } 

    private void setupViewPagerAdapter(int currentPos) 
    { 
     mAdapterViewPager = new MainPagerAdapter(getSupportFragmentManager()); 

     mViewPager.setAdapter(mAdapterViewPager); 
     mViewPager.setOffscreenPageLimit(4); 
     mViewPager.setCurrentItem(currentPos); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
     outState.putSerializable(DIALOG_DATE, mLastSelectedDate);   //save the last date selected (or last date displayed) on rotation change. 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) 
    { 
     super.onRestoreInstanceState(savedInstanceState); 
     setDateFromDialog((Date) savedInstanceState.getSerializable(DIALOG_DATE)); //restore the last date selected to the new rotation change 
    } 

    public ProgressBar getProgressBar() 
    { 
     return mProgressBar; 
    } 

    @Override 
    public void setDateFromDialog(Date date) 
    { 
     String newDate = getFormattedDate(date); 
     updateTodaysDate();  
     mLastSelectedDate = date; 

     setupViewPagerAdapter(getViewPagerPos()); 

     if(newDate.equals(mTodaysDate)) 
      mDateTextView.setText("Today"); 
     else 
      mDateTextView.setText(newDate); 
    } 

    private int getViewPagerPos() 
    { 
     return mViewPager.getCurrentItem(); 
    } 
} 

2 düğme mPrevDateButton ve mNextDateButton tıklandığında sorunu "çözmek" butonları bulunmaktadır. Tıklama dinleyicilerinde, updateDate() yöntemi yalnızca bir TextView nesnesiyle ilgili şeyler yapıyor ve bu yüzden tanımları eklemedim (bu yüzden yayını mümkün olduğunca kısa tutmaya çalışıyorum). Bu yüzden benim setupViewPagerAdapter() yöntemimle bir ilgisi olduğunu biliyorum. Bu yöntemi onCreate() ve onResume() eklemeye çalıştım ancak Fragments hala boş kalıyor. İşte

public class MainPagerAdapter extends FragmentPagerAdapter 
{ 
    private final String[] mFragmentTitleList = {"My Games", "All Games", "All Places", "My Places"}; //tab title names 
    private final static int NUM_FRAGMENTS = 4; 

    public MainPagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     switch(position) 
     { 
      case 0: 
       return MyGamesFragment.newInstance(); 
      case 1: 
       return AllGamesFragment.newInstance(); 
      case 2: 
       return AllPlacesFragment.newInstance(); 
      case 3: 
       return MyPlacesFragment.newInstance(); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() 
    { 
     return NUM_FRAGMENTS; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) 
    { 
     return mFragmentTitleList[position]; 
    } 
} 

4 parçasından biri:

İşte benim ViewPager adaptör kodudur. Hemen hemen hepsi benzer tasarıma sahipler.

public class AllGamesFragment extends Fragment 
{ 
    private SwipeRefreshLayout mSwipeRefreshLayout; 
    private RecyclerView mAllGamesRecyclerView; 
    private GameAdapter mGameAdapter; 
    private List<Game> mGameList = new ArrayList<>(); 
    private MainActivity mMainActivity;  //keeps a reference to MainActivity to access public methods 

    public static AllGamesFragment newInstance() 
    { 
     return new AllGamesFragment(); 
    } 

    @Override 
    public void onAttach(Context context) 
    { 
     super.onAttach(context); 
     mMainActivity = (MainActivity) context; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
     mMainActivity.getProgressBar().setVisibility(View.VISIBLE); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View view = inflater.inflate(R.layout.recycler_view_all_games, container, false); 
     mAllGamesRecyclerView = (RecyclerView) view.findViewById(R.id.all_games_recycler_view); 
     mAllGamesRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh); 
     mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() 
     { 
      @Override 
      public void onRefresh() 
      { 
       getGamesData(); 
       mSwipeRefreshLayout.setRefreshing(false); 
      } 
     }); 

     return view; 
    } 

    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     getGamesData(); 
    } 

    private void setupAdapter() 
    { 
     if(isAdded()) 
     { 
      mGameAdapter = new GameAdapter(mGameList); 
      mAllGamesRecyclerView.setAdapter(mGameAdapter); 
     } 
    } 

    private void getGamesData() 
    { 
     new GetDataTask(mMainActivity.getLastSelectedDate()).execute(); 
    } 

    private class GetDataTask extends Scraper.GameDataTask 
    { 
     GetDataTask(Date date) 
     { 
      super(date, getActivity()); 
     } 

     @Override 
     protected void onPostExecute(List<Game> games) 
     { 
      mGameList = games; 
      setupAdapter(); 
      mMainActivity.getProgressBar().setVisibility(View.GONE); 
     } 
    } 

    private class GameAdapter extends RecyclerView.Adapter<GameHolder> 
    { 
     private List<Game> mGames; 

     public GameAdapter(List<Game> games) 
     { 
      mGames = games; 
     } 

     @Override 
     public GameHolder onCreateViewHolder(ViewGroup parent, int viewType) 
     { 
      LayoutInflater inflater = LayoutInflater.from(getActivity()); 
      View view = inflater.inflate(R.layout.list_game_item, parent, false); 
      return new GameHolder(view, getActivity()); 
     } 

     @Override 
     public void onBindViewHolder(GameHolder holder, int position) 
     { 
      holder.bindGameData(mGames.get(position)); 
     } 

     @Override 
     public int getItemCount() 
     { 
      return mGames.size(); 
     } 
    } 

Burada çok fazla gönderiye baktım, kodumu defalarca değiştirdim ve yine de çalışmaya başlayamıyorum. Sadece tarih düğmelerinden birine tıkladığımda "düzeltir" diye şaşırdım. Eğer bir şeyden daha fazla kod yayınlamamı istersen haberim olsun. Uzun yazı için üzgünüm ama bağlamın gerekli olduğunu hissediyorum. Gerçekten herhangi bir yardım için minnettarım!

+0

Burada bildirdiğiniz ve başlattığınız, bir etkinliğe eklenmiş olup olmadığını denetleyen bir Fragmentin işlevinde yerleşik olan isedded() –

+0

@ HRaval'dır. –

+0

[bu] deneyin (http://stackoverflow.com/a/17629575/3117966), umarım yardımcı olur – Nisarg

cevap

3

Bunu çözdüm! FragmentPagerAdapter kullanmak yerine FragmentStatePagerAdapter'a geçmek zorunda kaldım. Parçaların imha edilmesine ve yeniden yaratılmasına neden olabileceğine inanıyorum.

Ben de başka bir yol, bir Fragment ViewPager sarmak için olacağını okumak ve onun adaptörü oluştururken böyle getChildFragmentManager() yerine getSupportFragmentManager() kullanın: Ben eklemek zorunda istemiyordu

mAdapterViewPager = new MyPagerAdapter(getChildFragmentManager()); 

ViewPager'ımın tam bir parçasını sadece bu sorunu düzeltmek için FragmentStatePagerAdapter'u kullanmaya başladım ve işe yaradı! Umarım bu, başka birisine yardım eder.

0

ViewPager bağdaştırıcısı yapmak FragmentStatePagerAdapter öğesini genişletir ve FragmentPagerAdapter sorunu çözmemelidir.

+0

SO. Bu bir yorum olmalı, bir cevap değil. –

İlgili konular