tablayout+viewpager+fragment组合使用以及懒加载机制
来源:互联网 发布:转行it 知乎 编辑:程序博客网 时间:2024/05/17 20:26
在开发中经常用到TabLayout+ViewPager+Fragment的组合。如下图所示:
首先介绍一下使用方法:
xml文件
1234567891011121314
<android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#EF8D11" app:tabIndicatorColor="#EF4A11" app:tabMode="scrollable" app:tabSelectedTextColor="#FFFFFF" app:tabTextAppearance="@style/MyTabLayoutTextAppearance" app:tabTextColor="#FFFFFF" /><android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" />
属性说明:android:background="#EF8D11"
背景色app:tabIndicatorColor="#EF4A11"
tab文字下方的那条线的颜色app:tabMode="scrollable"
如果tab过多超出屏幕宽度可以水平滚动app:tabSelectedTextColor="#FFFFFF"
tab被选中的时候文字的颜色app:tabTextColor="#FFFFFF"
tab未被选中时文字的颜色app:tabTextAppearance="@style/MyTabLayoutTextAppearance"
自定义字体大小(一般使用默认即可)
123
<style name="MyTabLayoutTextAppearance" parent="TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"> <item name="android:textSize">12sp</item></style>
java 代码
123456789
private void setTabs() { HomePagerAdapter homePagerAdapter = new HomePagerAdapter(getSupportFragmentManager()); homePagerAdapter.addTab(new FragmentOne(), "tab1"); homePagerAdapter.addTab(new FragmentTwo(), "tab2"); homePagerAdapter.addTab(new FragmentThree(), "tab3"); viewPager.setAdapter(homePagerAdapter); //把tabLayout和Viewpager关联起来 tabLayout.setupWithViewPager(viewPager); }
HomePagerAdapter.java
12345678910111213141516171819202122232425262728293031323334353637383940
package com.jetsun.demo;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentStatePagerAdapter;import java.util.ArrayList;import java.util.List;/** * Overview: */public class HomePagerAdapter extends FragmentStatePagerAdapter { private List<Fragment> fragments = new ArrayList<>(); private List<String> titles = new ArrayList<>(); public HomePagerAdapter(FragmentManager fm) { super(fm); } public void addTab(Fragment fragment, String title) { fragments.add(fragment); titles.add(title); } @Override public CharSequence getPageTitle(int position) { return titles.get(position); } @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); }}
懒加载机制
默认情况下,当显示tab1时,tab2已经加载了(已经调用了生命周期的oncreate,oncreateview,onactivitycreate,onresume方法),也就是默认加载当前fragment两边的一个fragment。加载的个数可以通过viewpager.setoffscreenpagelimit方法控制,模式是viewpager.setoffscreenpagelimit(1).最少也就是1,即使设置成0也默认预加载一个。假如现在的需求是要在fragment显示出来的时候才加载数据,那么通过viewpager.setoffscreenpagelimit方法是无法做到控制的。
下面就介绍另外一种方法来实现这种需求:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
package com.jetsun.demo;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import butterknife.Bind;import butterknife.ButterKnife;/** * Overview: */public class FragmentDemo extends Fragment { @Bind(R.id.recycler_view) RecyclerView recyclerView; @Bind(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout; //控件是否已经初始化 private boolean isCreateView = false; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, null, false); ButterKnife.bind(this, view); initViews(); isCreateView = true; return view; } private void initViews() { //初始化控件 }//此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isCreateView) { lazyLoad(); } } private void lazyLoad() { //加载数据操作 } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //第一个fragment会调用 if (getUserVisibleHint()) lazyLoad(); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); }}
在实际开发中,可以把上面的代码抽取到BaseFragment中使用。上面这个方法实现了每次fragment显示出来的时候加载数据,但是这样切换回来的时候还会重复加载,我们只需加载一次就好了。所以改进一下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
package com.jetsun.demo;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import butterknife.Bind;import butterknife.ButterKnife;/** * Overview: */public class FragmentDemo extends Fragment { @Bind(R.id.recycler_view) RecyclerView recyclerView; @Bind(R.id.swipe_refresh_layout) SwipeRefreshLayout swipeRefreshLayout; //控件是否已经初始化 private boolean isCreateView = false; //是否已经加载过数据 private boolean isLoadData = false; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment, null, false); ButterKnife.bind(this, view); initViews(); isCreateView = true; return view; } private void initViews() { //初始化控件 }//此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && isCreateView) { lazyLoad(); } } private void lazyLoad() { //如果没有加载过就加载,否则就不再加载了 if(!isLoadData){ //加载数据操作 isLoadData=true; } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //第一个fragment会调用 if (getUserVisibleHint()) lazyLoad(); } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); }}
- Tablayout+Viewpager+Fragment组合使用以及懒加载机制
- tablayout+viewpager+fragment组合使用以及懒加载机制
- ViewPager+TabLayout+Fragment懒加载机制完全解析
- Android开发ViewPager的预加载和Fragment的销毁问题,以及tabLayout+ViewPager的使用
- TabLayout-ViewPager填充Fragment和懒加载
- TabLayout+ViewPager+Fragment懒加载实现
- TabLayout+ViewPager+Fragment实现懒加载
- TabLayout+ViewPager+fragment实现懒加载
- Fragment+ViewPager+TabLayout 使用
- Android开发丶使用懒加载修复tablayout+viewpager+fragment的预加载
- TabLayout,ViewPager,Fragment组合页卡
- TabLayout 和 ViewPager 组合显示Fragment
- TabLayout,ViewPager,Fragment组合页卡
- TabLayout的简单使用(TabLayout+Fragment+ViewPager)
- TabLayout+Fragment+ViewPager联合使用
- ViewPager+Fragment+TabLayout联合使用
- TabLayout+ViewPager+Fragment联合使用
- TabLayout,ViewPager,Fragment结合使用
- java学习初步总结
- CSS对于元素隐藏的几种方法
- qduoj 96 一道非常简单的签到题
- Dojo1.11官方教程文档翻译(1.2)Hello Dojo!
- UGUI替换Image图片的三种方式
- tablayout+viewpager+fragment组合使用以及懒加载机制
- NameNode格式化失败问题的解决
- 常用游戏逻辑编程
- 验证二叉树后序遍历序列是否符合要求
- “无中生有”计算机视觉探奇
- 我对C++ string和length方法的一个长期误解------从protobuf序列化说起(没处理好会引起数据丢失、反序列化失败哦!)
- 【Android】14、SimpleAdapter
- **1051 - My-graph-同构图
- javaPOI导出excel代码