ViewPager(1)FragmentPagerAdapter


FragmentPagerAdapter 适合只有少量的pager,所有pager同时全部存在,不会有被销毁的,page过多很容易内存溢出.

1,代码

1.1 ViewPagerMain.java

复制代码
 1 import android.os.Bundle;
 2 import android.support.v4.app.Fragment;
 3 import android.support.v4.view.ViewPager;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 
 8 import com.txw.e.viewpager.R;
 9 
10 public class ViewPagerMain extends Fragment {
11 
12     //1,在layout.xml中添加 ViewPagerFragment,它可以是顶级布局,如下:
13     /*
14     <?xml version="1.0" encoding="utf-8"?>
15     <android.support.v4.view.ViewPagerFragment
16         android:id="@+id/view_pager"
17         xmlns:android="http://schemas.android.com/apk/res/android"
18         android:layout_width="match_parent"
19         android:layout_height="match_parent"/>
20     */
21 
22     //2,准备变量,ViewPager和 PagerAdapter ,OnPageChangeListener
23     ViewPager pager;
24     ViewPagerAdapter pagerAdapter;
25     ViewPager.SimpleOnPageChangeListener simpleOnPageChangeListener;
26 
27     //3,初始化pager
28     void initPager(View v){
29         //从layout.xml中初始化pager
30         pager = (ViewPager) v.findViewById(R.id.view_pager);
31 
32         //初始化page adapter
33         pagerAdapter = new ViewPagerAdapter(getFragmentManager());
34 
35         //设置adapter
36         pager.setAdapter(pagerAdapter);
37 
38         //设置page切换监听者
39         simpleOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener();
40         pager.addOnPageChangeListener(simpleOnPageChangeListener);
41 
42         //设置pager切换动画
43         pager.setPageTransformer(true, new DepthPageTransformer());
44 
45 
46     }
47 
48     //4,处理 pager 切换事件
49     //这里用的ViewPager.SimpleOnPageChangeListener,它什么也不做。
50 
51     //5,重写切换动画类,可以把这个类放到外面去。
52     public class DepthPageTransformer implements ViewPager.PageTransformer {
53         private static final float MIN_SCALE = 0.75f;
54 
55         public void transformPage(View view, float position) {
56             int pageWidth = view.getWidth();
57 
58             if (position < -1) { // [-Infinity,-1)
59                 // This page is way off-screen to the left.
60                 view.setAlpha(0);
61 
62             } else if (position <= 0) { // [-1,0]
63                 // Use the default slide transition when moving to the left page
64                 view.setAlpha(1);
65                 view.setTranslationX(0);
66                 view.setScaleX(1);
67                 view.setScaleY(1);
68 
69             } else if (position <= 1) { // (0,1]
70                 // Fade the page out.
71                 view.setAlpha(1 - position);
72 
73                 // Counteract the default slide transition
74                 view.setTranslationX(pageWidth * -position);
75 
76                 // Scale the page down (between MIN_SCALE and 1)
77                 float scaleFactor = MIN_SCALE
78                         + (1 - MIN_SCALE) * (1 - Math.abs(position));
79                 view.setScaleX(scaleFactor);
80                 view.setScaleY(scaleFactor);
81 
82             } else { // (1,+Infinity]
83                 // This page is way off-screen to the right.
84                 view.setAlpha(0);
85             }
86         }
87     }
88 
89     @Override
90     public View onCreateView(LayoutInflater inflater, ViewGroup container,
91                              Bundle savedInstanceState) {
92         // Inflate the layout for this fragment
93         View v = inflater.inflate(R.layout.fragment_pager_main, container, false);
94 
95         initPager(v);
96 
97         return v;
98     }
99 }
复制代码

1.2 ViewPagerAdapter.java

复制代码
 1 import android.os.Bundle;
 2 import android.support.v4.app.Fragment;
 3 import android.support.v4.app.FragmentManager;
 4 import android.support.v4.app.FragmentPagerAdapter;
 5 
 6 public class ViewPagerAdapter extends FragmentPagerAdapter{
 7 
 8     /*
 9     适合只有少量的pager,所有pager同时全部存在,不会有被销毁的,page过多很容易内存溢出.
10     */
11     public ViewPagerAdapter(FragmentManager fm) {
12         super(fm);
13     }
14 
15     @Override
16     public Fragment getItem(int position) {
17         System.out.println("getItem:create fragment");
18         ViewPagerFragment fragment = new ViewPagerFragment();
19         Bundle args = new Bundle();
20         args.putInt("ID",position);
21         fragment.setArguments(args);
22         return fragment;
23     }
24 
25     @Override
26     public int getCount() {
27         return 5;
28     }
29 }
复制代码

1.3 ViewPagerFragment.java

复制代码
 1 import android.os.Bundle;
 2 import android.support.v4.app.Fragment;
 3 import android.view.LayoutInflater;
 4 import android.view.View;
 5 import android.view.ViewGroup;
 6 import android.widget.TextView;
 7 
 8 import com.txw.e.viewpager.R;
 9 
10 public class ViewPagerFragment extends Fragment {
11 
12 
13     @Override
14     public void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         System.out.println("ViewPagerFragment" + getArguments().getInt("ID") + "::onCreate()");
17     }
18 
19     @Override
20     public View onCreateView(LayoutInflater inflater, ViewGroup container,
21                              Bundle savedInstanceState) {
22         // Inflate the layout for this fragment
23         View v = inflater.inflate(R.layout.fragment_pager, container, false);
24         TextView tv = (TextView) v.findViewById(R.id.view_pager_content);
25         Bundle args = getArguments();
26         int position = args.getInt("ID");
27         tv.setText("ViewPagerFragment " + position);
28         v.setTranslationX(-1 * v.getWidth() * position);
29         return v;
30     }
31 
32     @Override
33     public void onDestroy() {
34         super.onDestroy();
35         System.out.println("ViewPagerFragment" + getArguments().getInt("ID") + "::onDestroy()");
36     }
37 
38 }
复制代码

2,xml

2.1 fragment_pager_main.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.v4.view.ViewPager
3     android:id="@+id/view_pager"
4     xmlns:android="http://schemas.android.com/apk/res/android"
5     android:background="#FFFFFF"
6     android:layout_width="match_parent"
7     android:layout_height="match_parent"/>

2.2 fragment_pager.xml

复制代码
 1 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2              xmlns:tools="http://schemas.android.com/tools"
 3              android:layout_width="match_parent"
 4              android:layout_height="match_parent"
 5              android:background="#FFFFFF"
 6              tools:context=".ViewPager.ViewPagerFragment">
 7 
 8     <TextView
 9         android:id="@+id/view_pager_txt"
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:text="适合只有少量的pager,所有pager同时全部存在,不会有被销毁的,page过多很容易内存溢出.\n可以在LogCat中查看page对应的Fragment\n的onCreate,onDestory"/>
13 
14     <TextView
15         android:id="@+id/view_pager_content"
16         android:layout_width="match_parent"
17         android:layout_height="match_parent"
18         android:gravity="center_horizontal|center_vertical"
19         android:text="@string/hello_blank_fragment"/>
20 
21 </FrameLayout>
复制代码

 

posted @   f9q  阅读(242)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示