引言
viewpager和fragment是项目中亮相最多的组合,很多场景,例如 项目起始页,新闻首页,商城分类页,订单列表页等等,应用场景广泛,希望大家好好学习
基本用法
xml文件
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tab1"
android:gravity="center"
android:layout_marginLeft="1dp
android:background="#ccc000"
/>
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tab2"
android:gravity="center"
android:layout_marginLeft="1dp"
android:background="#ccc000"
/>
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="tab3"
android:gravity="center"
android:layout_arginLeft="1dp"
android:background="#ccc000"
/>
</LinearLayout>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pager">
</android.support.v4.view.ViewPager>
</LinearLayout>
Fragment
public class MyFragment extends android.support.v4.app.Fragment{
View view;
ListView listView;
private String data[]={"南京","北京","深圳","桂林","南宁","上海","北京","深圳","桂林","南宁","上海","北京","深圳","桂林","南宁"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//解析Fragment布局文件
view =inflater.inflate(R.layout.fragment, null);
//获取listView控件
listView=(ListView)view.findViewById(R.id.listView);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//创建适配器
ArrayAdapter<String> adapter=new ArrayAdapter<String>(getActivity(),R.layout.simple_adapter_item, R.id.text1,data);
listView.setAdapter(adapter);
//listview 监听
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(getActivity(),data[i],Toast.LENGTH_SHORT).show();
}
})
}
}
activity页面
public class PagerActivity extends Activity {
ViewPager pager;
private List<MyFragment> list;
private String data[] = {"第一页", "第二页", "第三页"};
private LinearLayout layout;
private TextView textView[];
private ViewPager view_pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pager);
//初始化Fragment数组
pager = (ViewPager) this.findViewById(R.id.pager);
list = new ArrayList<MyFragment>();
list.add(new MyFragment());
list.add(new MyFragment());
list.add(new MyFragment());
//创建自定的适配器对象
MyAdapter adapter=new MyAdapter(getSupportFragmentManager(), list);
pager.setAdapter(adapter);
LinearLayout layout = (LinearLayout) this.findViewById(R.id.layout);
//获取LinearLayout容器
final int num = layout.getChildCount();
//获取容器的子控件个数
textView = new TextView[num];
//实例化标题数组
for (int i = 0; i < num; i++) {
textView[i] = (TextView) layout.getChildAt(i);//循环获取子控件
textView[i].setText(data[i]);//设置标题
textView[i].setTag(i);//设置标识
textView[i].setBackgroundColor(Color.GRAY);//初始化每个控件都设置背景为灰色
/**
*
* 循环对容器中的每个子控件监听
*/
textView[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int item = (Integer) view.getTag();//获取控件标识
pager.setCurrentItem(item);//切换pagerView
for (int i1 = 0; i1 < num; i1++) {
textView[i1].setBackgroundColor(Color.GRAY);//所有标签都改为灰色
}
textView[item].setBackgroundColor(Color.YELLOW);//选中的标签为黄色
}
});
textView[i].setEnabled(true);//设置标签是否可点击
}
textView[0].setBackgroundColor(Color.YELLOW);//初始化默认第一个为选中状态
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
/**
* pagerView被切换后自动执行的方法
*/
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
public void select() {
}
}
fragment适配器
/**
* 定义FragmentPager适配器类 fragmentPager适配器
*/
class MyAdapter extends FragmentPagerAdapter {
private List<MyFragment> fragments;//fragment管理员
private FragmentManager fm;//fragment数组
/**
* 构造函数
* @param fm fragment管理员对象
* @param fragmentList fragment数组
*/
public MyAdapter(FragmentManager fm, List<MyFragment> fragmentList) {
super(fm);
this.fragments=fragmentList;
this.fm=fm;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
小tips
由于fragment作为页面通常会承担非常多的逻辑任务(比如 今日头条的首页),所以需要对fragment实行懒加载策略,避免 加载过多导致页面反应慢,甚至卡顿
常用的方法有:
1,ViewPager因为内部机制,有预加载机制。所以设置为0可以防止加载多个fragment引起的性能问题。
vp.setOffscreenPageLimit(0);
,2,利用fragment的内部懒加载机制
(1)、创建新的Fragment类,继承BaseFragment;
(2)、setContentView(),返回该xml布局文件;
(3)、lazyLoad(),在此方法内加载需要的数据;
(4)、stopLoad()方法可选,当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法。
结语
关于本组合控件,需要自己多揣摩和练习,才能熟练使用,其实仔细观察就会发现,基本所有的app都会用到这个组合组件