我的应用程序有一个活动,该活动使用回收者视图显示项目列表。选择一个列表项后,与该列表项关联的模型对象的UUID会作为附加意图发送到另一个活动,该活动的布局中具有ViewPager2适配器。我使用FragmentStateAdapter类创建了一个适配器,并将适配器附加到viewpager2小部件。由于某种原因,即使将正确的UUID发送到ViewPager2活动,并且在FragmentStateAdapter#createFragment方法中使用了正确的项目位置,我也显示了错误的片段。还将正确的UUID发送到创建的片段,并在创建的片段的小部件上设置正确的模型数据。我使用一个称为CrimeLab的单例来存储犯罪对象列表以及通过其UUID返回模型对象并返回存储的犯罪对象列表的方法。下面是该活动的代码,其中包含一个ViewPager2小部件并实现FragmentStateAdapter。
public class CrimePagerActivity extends AppCompatActivity{
private static final String EXTRA_ID = "com.bignerdranch.android.extra_id";
private ViewPager2 crimePager;
private CrimePagerAdapter adapter;
private List<Crime> crimes;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
crimes = CrimeLab.get(this).getCrimes();
crimePager = findViewById(R.id.crime_pager);
UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_ID);
Crime crime = CrimeLab.get(this).getCrime(crimeId);
adapter = new CrimePagerAdapter(this);
crimePager.setAdapter(adapter);
crimePager.setCurrentItem(crimes.indexOf(crime));
}
private class CrimePagerAdapter extends FragmentStateAdapter {
public CrimePagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull
@Override
public Fragment createFragment(int position) {
Crime crime = crimes.get(position);
return CrimeFragment.newInstance(crime.getId());
}
@Override
public int getItemCount() {
return crimes.size();
}
}
public static Intent createIntent(Context context, UUID crimeId) {
Intent intent = new Intent(context, CrimePagerActivity.class);
intent.putExtra(EXTRA_ID, crimeId);
return intent;
}
}