接下来学习 viewPager+FragmentPagerAdapter 实现切屏 效果
1.定义 Fragemnt 的 页面内容
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/test_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
2.实现自定义的 Fragment
public class TestFragment extends Fragment {
private TextView textView = null;
private String string = null;
public TestFragment() {
super();
}
public TextView getTextView() {
return textView;
}
public void setTextView(String str){
this.string = str;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//return super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.activity_fragment,container,false);
textView = (TextView)view.findViewById(R.id.test_text);
textView.setText(string);
return view;
}
}
inflate 的自我理解,没有查档案 inflate(view样式,view所在的容器,是否是根容器)
3.实现 自定义的 MyFramentAdapter
public class MyFramentAdapter extends FragmentPagerAdapter {
private ArrayList<TestFragment> arrayList = null;
public MyFramentAdapter(FragmentManager fm, ArrayList<TestFragment> arrayList) {
super(fm);
this.arrayList = arrayList;
}
@Override
public Fragment getItem(int position) {
//return null;
return arrayList.get(position);
}
@Override
public int getCount() {
// return 0;
return arrayList.size();
}
}
4.MainActivity 实现
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager)findViewById(R.id.myViewPager);
list = new ArrayList<TestFragment>();
TestFragment one_fragment = new TestFragment();
one_fragment.setTextView("one_fragment");
list.add(one_fragment);
TestFragment two_fragment = new TestFragment();
two_fragment.setTextView("two_fragment");
list.add(two_fragment);
TestFragment three_fragemnt = new TestFragment();
three_fragemnt.setTextView("three_fragemnt");
list.add(three_fragemnt);
myFramentAdapter = new MyFramentAdapter(getSupportFragmentManager(),list);
viewPager.setAdapter(myFramentAdapter);
}
这些适配器实现等 都可以参照 listview的实现过程
viewPager.setCurrentItem(2);
setCurrentItem 可以直接显示要展示的view
viewPager.OnPageChangeListener{
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
public void onPageSelected(int position);
public void onPageScrollStateChanged(int state);
}
实际开发中ViewPager有两个操作:
1.一个是用手指滑动翻页
2.一个是直接setCurrentItem(一般用于点击上面的tab直接setCurrentItem)
三个函数讲解
1.onPageSelected(int position):
本方法参数 position 代表哪个页面被选中。
手指滑动翻页,如果翻动成功了(滑动的距离够长),手指抬起来就会立即执行这个方法,position就是当前滑动到的页面。
通过setCurrentItem翻页,则position会和setCurrentItem的参数一致,该情况在onPageScrolled方法前立即执行。
2.onPageScrolled(int position,float positionOffset, int positionOffsetPixels):
本方法会在屏幕滚动过程中不断被调用。
3.onPageScrollStateChanged(int state):
本方法在手指操作屏幕的时候发生变化。有三个值:0(END),1(PRESS) , 2(UP) 。
当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1,
手指抬起时,如果发生了滑动(即使很小),这个值会变为2,然后最后变为0 。总共执行这个方法三次。
特殊情况:手指按下去以后一点滑动也没有发生,这个时候只会调用这个方法两次,state值分别是1,0 。
当setCurrentItem翻页时,会执行这个方法两次,state值分别为2 , 0 。
用手指拖动翻页时的执行顺序:
1.先执行一遍onPageScrollStateChanged,
2.然后不断执行onPageScrolled,放手指的时候,直接立即执行一次onPageScrollStateChanged,然后立即执行一次onPageSelected,然后再不断执行onPageScrollStateChanged
3.最后执行一次onPageScrollStateChanged。
参考内容:
https://www.cnblogs.com/android-blogs/p/5524172.html
https://blog.csdn.net/xieluoxixi/article/details/54983525