首页 > 解决方案 > 带有 ViewPager2 的 FragmentStateAdapter 显示不正确的片段

问题描述

我的应用程序有一个活动,它使用RecyclerView. 选择列表项目时,将与该列表项目关联的模型对象的UUID作为另一个活动的意图发送,该活动ViewPager2在其布局中具有适配器。

我使用FragmentStateAdapter该类创建了一个适配器并将适配器附加到ViewPager2小部件。出于某种原因,即使将正确的 UUID 发送到ViewPager2Activity 并且在方法中使用了正确的项目位置,我也会显示错误的片段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;
}
}

标签: javaandroidandroid-viewpager2fragmentstateadapter

解决方案


推荐阅读