2017-04-27 35 views
1

下面是我目前正在得到的结果。自定义TabLayout:notifydatasetchanged恢复标签的自定义视图回到默认

Result

预期的结果应该是他们三人的表现为第三个选项卡。

这是我如何设置我的标签布局。

可重复使用的方法添加片段以查看寻呼机/选项卡布局。

​​

我如何添加片段:

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

而且我FragmentViewPagerAdapter:在addFragmentToViewPager

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

结果为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 

更新:

我发现,后

fragmentViewPagerAdapter.notifyDataSetChanged();

调用后,标签​​布局将被更改回默认视图。有没有办法阻止notifyDataSetChanged()不影响标签布局的自定义视图?因为我的标签布局选项卡都在旅途中集(应用程序将获取从服务器选项卡的内容,并设置了),所以我的想法是先设置viewpager第一:

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

    mViewPager.setAdapter(fragmentViewPagerAdapter); 

    mTabLayout.setupWithViewPager(mViewPager); 

然后在该片段中使用添加:

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

在此先感谢

+0

您是否找到解决方案? – Paul

+0

Yeap,我发布了下面的解决方案。 https://stackoverflow.com/a/48739721/7130559 – wenyang9319

+0

请不要犹豫,如果它可以帮助你upvote我的答案。提前致谢。 – wenyang9319

回答

1

该解决方案非常简单。

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

所以解决方法是首先将片段添加到fragmentViewPager,然后调用notifyDataSetChanged,然后自定义您的布局。

您应该只在调用notifyDataSetChanged后自定义布局。

0

尝试使用材料设计TabLayout

的gradle中:

compile 'com.android.support:appcompat-v7:23.0.1' 
compile 'com.android.support:design:23.0.1' 

在代码:

public class MainActivity extends AppCompatActivity { 

    private Toolbar toolbar; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private int[] tabIcons = { 
      R.drawable.ic_tab_favourite, 
      R.drawable.ic_tab_call, 
      R.drawable.ic_tab_contacts 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
     setupTabIcons(); 
    } 

    private void setupTabIcons() { 

     TextView tabOne = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null); 
     tabOne.setText("ONE"); 
     tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_favourite, 0, 0); 
     tabLayout.getTabAt(0).setCustomView(tabOne); 

     TextView tabTwo = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null); 
     tabTwo.setText("TWO"); 
     tabTwo.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_call, 0, 0); 
     tabLayout.getTabAt(1).setCustomView(tabTwo); 

     TextView tabThree = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null); 
     tabThree.setText("THREE"); 
     tabThree.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_tab_contacts, 0, 0); 
     tabLayout.getTabAt(2).setCustomView(tabThree); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFrag(new OneFragment(), "ONE"); 
     adapter.addFrag(new TwoFragment(), "TWO"); 
     adapter.addFrag(new ThreeFragment(), "THREE"); 
     viewPager.setAdapter(adapter); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

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

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

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

     public void addFrag(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
    } 
} 

布局:

activity_main.xml中:

<android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/custom_tab_layout_height" 
     app:tabMode="fixed" 
     app:tabGravity="fill"/> 

输出:

enter image description here

以下是详细信息Implementation

+0

感谢您的回答,但我需要将图像置于圆形图像视图中,并且图像将在运行时由Picasso下载,因此我需要在自定义视图中设置选项卡视图,包括圆角图像视图,上面的答案是将选项卡中的图像设置为自定义视图(tab.setCompoundDrawablesWithIntrinsicBounds)。无论如何,感谢您的回复。 – wenyang9319

相关问题