【问题标题】:FragmentStateAdapter removing last tab instead of current ViewPager2FragmentStateAdapter 删除最后一个选项卡而不是当前 ViewPager2
【发布时间】:2020-03-06 13:00:01
【问题描述】:

ViewPager2 正在删除最后一个选项卡而不是当前选项卡,当我使用 viewpager 时出现同样的问题。
Also when selected tab is last one it removes last tab correctly
依赖

implementation "androidx.viewpager2:viewpager2:1.0.0"

这是主要活动代码
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();
        }
    }


片段
这是我要添加和删除的动态片段

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;
    }
}

【问题讨论】:

  • 试试return position;而不是return super.getItemId(position);
  • 我试过了,工作方式和以前一样.. 当我删除标签并再次添加时,以前的数据会自动出现在我在删除片段之前编写的 edittext 上
  • 你没有使用mFragmentList来显示片段,只是用于添加和删除所以尝试mFragmentList.get(position);而不是return DynamicFragment.newInstance(String.valueOf(position),mFragmentIdList.get(position));
  • 仍在删除最后一个索引。当我再次添加标签时,已删除标签的数据再次出现
  • 确保检查您的操作值tabLayout.getSelectedTabPosition

标签: java android android-viewpager fragmentstatepageradapter android-viewpager2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要覆盖方法 getItemId() 和 containsItemId() 如本帖所示:https://stackoverflow.com/a/57944197/870242

    items 变量保存您的片段 (mFragmentList )

    private val pageIds= items.map { it.hashCode().toLong() }
    
    override fun getItemId(position: Int): Long {
        return items[position].hashCode().toLong() // make sure notifyDataSetChanged() works
    }
    
    override fun containsItem(itemId: Long): Boolean {
        return pageIds.contains(itemId)
    }
    

    【讨论】:

    • 我认为每当你更新号码时,你还需要重新初始化pageIds = items.map { it.hashCode().toLong() }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多