自定义 TabLayout:notifydatasetchanged 将选项卡的自定义视图恢复为默认值
Customised TabLayout: notifydatasetchanged revert custom view of tabs back to the default
下面是我目前得到的结果。
预期的结果应该是其中三个作为第三个选项卡。
这就是我设置选项卡布局的方式。
添加片段以查看分页器/选项卡布局的可重用方法。
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);
}
}
我如何添加片段:
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:
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);
}
}
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
更新:
我发现
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);
}
}
提前致谢
尝试使用 Material 设计 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"/>
输出:
这是详细信息Implementation
解决方案非常简单。
我们应该了解 PagerAdapter.notifyDataSetChange() 的工作原理。通过调用它,选项卡将被重新加载。我贴的方法是在外部更改布局。这意味着自定义布局将恢复为默认布局。
所以解决方案是先将片段添加到 fragmentViewPager
,然后调用 notifyDataSetChanged
,然后自定义布局。
您只能在调用 notifyDataSetChanged
后自定义您的布局。
下面是我目前得到的结果。
预期的结果应该是其中三个作为第三个选项卡。
这就是我设置选项卡布局的方式。
添加片段以查看分页器/选项卡布局的可重用方法。
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);
}
}
我如何添加片段:
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:
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);
}
}
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
更新:
我发现
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);
}
}
提前致谢
尝试使用 Material 设计 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"/>
输出:
这是详细信息Implementation
解决方案非常简单。
我们应该了解 PagerAdapter.notifyDataSetChange() 的工作原理。通过调用它,选项卡将被重新加载。我贴的方法是在外部更改布局。这意味着自定义布局将恢复为默认布局。
所以解决方案是先将片段添加到 fragmentViewPager
,然后调用 notifyDataSetChanged
,然后自定义布局。
您只能在调用 notifyDataSetChanged
后自定义您的布局。