自定义的TabLayout:notifydatasetchanged将选项卡的自定义视图恢复为默认值

wen*_*319 2 android android-fragments android-tablayout

以下是我目前得到的结果。

结果

预期结果应该是其中三个作为第三个选项卡。

这就是我设置标签布局的方式。

可重用的方法,用于添加片段以查看分页器/选项卡的布局。

public void addFragmentToViewPager(Fragment fragment, String title, int imageRes) {

    FragmentViewPagerAdapter fragmentViewPagerAdapter =
            (FragmentViewPagerAdapter) mViewPager.getAdapter();

    int position = fragmentViewPagerAdapter.addFragment(fragment, title);

    fragmentViewPagerAdapter.notifyDataSetChanged();

    View tabItemView = LayoutInflater.from(getContext()).inflate(R.layout.tab_item_child, null);

    RoundedImageView roundImageView = (RoundedImageView) tabItemView.findViewById(R.id.childitem_riv);

    roundImageView.setImageResource(imageRes);

    TextView textView = (TextView) tabItemView.findViewById(R.id.childitem_tv_title);

    textView.setText(title);

    TabLayout.Tab tab = mTabLayout.getTabAt(position);

    if (tab != null) {
        Log.d(TAG,tab.getText()+"");
        tab.setCustomView(tabItemView);
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何添加片段:

    getView().addFragmentToViewPager(new ReusableMomentFragment(), "One", R.mipmap.ic_launcher);

    getView().addFragmentToViewPager(new ReusableMomentFragment(), "Two", R.mipmap.ic_launcher);

    getView().addFragmentToViewPager(new ReusableMomentFragment(), "Three", R.mipmap.ic_launcher);
Run Code Online (Sandbox Code Playgroud)

还有我的FragmentViewPagerAdapter:

public class FragmentViewPagerAdapter extends FragmentPagerAdapter {

private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public FragmentViewPagerAdapter(FragmentManager manager) {
    super(manager);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

public int addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);

    return getCount() -1 ;
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}
}
Run Code Online (Sandbox Code Playgroud)

addFragmentToViewPager中Log.d的结果:

04-27 06:49:39.874 14334-14334/com.zxc.zxczxc D/MomentFragment: One
04-27 06:49:39.877 14334-14334/com.zxc.zxczxc D/MomentFragment: Two
04-27 06:49:39.878 14334-14334/com.zxc.zxczxc D/MomentFragment: Three
Run Code Online (Sandbox Code Playgroud)

更新:

我发现

fragmentViewPagerAdapter.notifyDataSetChanged();

调用后,标签​​页布局将更改回默认视图。有什么方法可以防止notifyDataSetChanged()不影响选项卡布局的自定义视图?因为我的标签布局标签是随时随地设置的(应用程序将从服务器获取标签内容并进行设置),所以我的想法是先设置viewpager:

FragmentViewPagerAdapter fragmentViewPagerAdapter =
            new FragmentViewPagerAdapter(getActivity().getSupportFragmentManager());

    mViewPager.setAdapter(fragmentViewPagerAdapter);

    mTabLayout.setupWithViewPager(mViewPager);
Run Code Online (Sandbox Code Playgroud)

然后使用添加片段:

    public void addFragmentToViewPager(Fragment fragment, String title, int imageRes) {

    FragmentViewPagerAdapter fragmentViewPagerAdapter =
            (FragmentViewPagerAdapter) mViewPager.getAdapter();

    int position = fragmentViewPagerAdapter.addFragment(fragment, title);

    View tabItemView = LayoutInflater.from(getContext()).inflate(R.layout.tab_item_child, null);

    RoundedImageView roundImageView = (RoundedImageView) tabItemView.findViewById(R.id.childitem_riv);

    roundImageView.setImageResource(imageRes);

    TextView textView = (TextView) tabItemView.findViewById(R.id.childitem_tv_title);

    textView.setText(title);

    TabLayout.Tab tab = mTabLayout.getTabAt(position);

    if (tab != null) {
        Log.d(TAG,tab.getText()+"");
        tab.setCustomView(tabItemView);
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

wen*_*319 5

解决方案非常简单。

我们应该了解PagerAdapter.notifyDataSetChange()的工作方式。通过调用它,标签将被重新加载。我发布的方法是从外部更改布局。这意味着自定义布局将恢复为默认设置。

因此,解决方案是先添加片段fragmentViewPager,再调用notifyDataSetChanged,然后自定义布局。

您只应在致电后自定义布局notifyDataSetChanged。