FragmentStateAdapter удаляет последнюю вкладку вместо текущего ViewPager2 - PullRequest
0 голосов
/ 06 марта 2020

ViewPager2 удаляет последнюю вкладку вместо текущей вкладки, такая же проблема возникала, когда я использовал viewpager.
Также, когда выбранная вкладка является последней, корректно удаляется последняя вкладка зависимость </p> <pre><code>implementation "androidx.viewpager2:viewpager2:1.0.0"

Это основной код деятельности MainActivity. java </p> <pre><code>public class MainActivity extends AppCompatActivity { TabLayout tabLayout; ViewPager2 viewPager; ViewPagerAdapter adapter; Button btnAddTab,btnRemoveCurrentTab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = findViewById(R.id.view_pager); tabLayout = findViewById(R.id.tabs); btnAddTab=findViewById(R.id.btn_add); btnRemoveCurrentTab=findViewById(R.id.btn_remove); adapter=new ViewPagerAdapter(this); viewPager.setAdapter(adapter); new TabLayoutMediator(tabLayout, viewPager, new TabLayoutMediator.TabConfigurationStrategy() { @Override public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { tab.setText("Store " + (position + 1)); } }).attach(); btnRemoveCurrentTab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.removeFrag(tabLayout.getSelectedTabPosition()); } }); btnAddTab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DynamicFragment fView = new DynamicFragment(); adapter.addFrag(fView,"Store "+(adapter.getmFragmentIdList().contains(adapter.getItemCount()+1)?adapter.getItemCount()+2:adapter.getItemCount()+1),(adapter.getmFragmentIdList().contains(adapter.getItemCount()+1)?adapter.getItemCount()+2:adapter.getItemCount()+1)); } }); } }

ViewPagerAdapter Это FragentStateAdapter </p> <pre><code>public class ViewPagerAdapter extends FragmentStateAdapter { private final List<DynamicFragment> mFragmentList = new ArrayList<>(); private final List<Integer> mFragmentIdList = new ArrayList<>(); public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) { super(fragmentActivity); } @NonNull @Override public Fragment createFragment(int position) { return DynamicFragment.newInstance(String.valueOf(position),mFragmentIdList.get(position)); } public void addFrag(DynamicFragment fragment, String title, int id) { mFragmentList.add(fragment); Log.e("fragment id " ,""+id); Log.e("fragment array " ,title+ mFragmentList.size()); mFragmentIdList.add(id); notifyDataSetChanged(); } public void removeFrag(int pos) { Log.e("deleted frag",mFragmentIdList.get(pos)+" "+pos); mFragmentList.remove(pos); mFragmentIdList.remove(pos); notifyDataSetChanged(); } public List<Integer> getmFragmentIdList() { return mFragmentIdList; } @Override public long getItemId(int position) { return super.getItemId(position); } @Override public int getItemCount() { return mFragmentList.size(); } }

Фрагмент Это мой динамический c фрагмент, который я хочу добавить и удалить </p> <pre><code>public class DynamicFragment extends Fragment { private static final String ARG_SECTION_NUMBER = "section_number"; private static final String ARG_ID = "id"; private String sectionNumber; int id; TextView textView; EditText editText1,editText2; public DynamicFragment() { // Required empty public constructor } public static DynamicFragment newInstance(String sectionNumber, int id) { DynamicFragment fragment = new DynamicFragment(); Bundle args = new Bundle(); args.putString(ARG_SECTION_NUMBER, sectionNumber); args.putInt(ARG_ID, id); fragment.setArguments(args); Log.e("StoreDynamic","dynamic new instance"); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View rootView= inflater.inflate(R.layout.fragment_dynamic, container, false); textView=rootView.findViewById(R.id.textView); editText1=rootView.findViewById(R.id.et1); editText2=rootView.findViewById(R.id.et2); sectionNumber = getArguments().getString(ARG_SECTION_NUMBER); id=getArguments().getInt(ARG_ID); editText1.setText(id+" "+sectionNumber); textView.setText(id+" "+sectionNumber); return rootView; } }

1 Ответ

0 голосов
/ 01 апреля 2020

Я столкнулся с той же проблемой и решением этого вопроса: Удалите фрагмент в viewPager2, используйте FragmentStateAdapter, но все равно отображение сработало для меня. В основном это часть о переопределении функции getItemId для возврата чего-либо, кроме позиции для идентификации элемента, потому что позиция элемента изменяется при добавлении и удалении фрагментов.

...