java - FragmentStateAdapter 删除最后一个选项卡而不是当前的 ViewPager2

标签 java android android-viewpager fragmentstatepageradapter android-viewpager2

ViewPager2 正在删除最后一个选项卡而不是当前选项卡,当我使用 viewpager 时发生了同样的问题。
此选中选项卡在最后一个选项卡时,它会正确删除最后一个选项卡

依赖

implementation "androidx.viewpager2:viewpager2:1.0.0"
这是主要 Activity 代码

MainActivity.java
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
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();
        }
    }

fragment

这是我要添加和删除的动态 fragment
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;
    }
}

最佳答案

我遇到了同样的问题和这个问题的解决方案:remove fragment in viewPager2 use FragmentStateAdapter, but still display为我工作。主要是关于覆盖 getItemId 函数以返回位置以外的其他内容来标识项目的部分,因为在添加和删除 fragment 时项目的位置会发生变化。

关于java - FragmentStateAdapter 删除最后一个选项卡而不是当前的 ViewPager2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60564603/

相关文章:

java - Android 蓝牙套接字连接使用 AsyncTask 在后台接收数据

android - 使用来自主应用程序的 Activity 在 android 库中调用 onRequestPermissionsResult

android - 在 ViewPager 中使用 Otto 时数据混合

java - org.springframework.orm.hibernate3.support.BlobByteArrayType 有什么用?

java - Maven和m2e-Eclipse-Plugin如何配合

java - 接口(interface)常量的使用

java - 我如何每 10 秒显示一个字符串中的一个随机单词?

javascript - React Native TextInput setState() 问题

java - 如何检测 onTouch 监听器中的点击?

android:根据ViewPager中的每个Fragment更新ActionBar项目?