一:简单的实现viewpage进行fragment的滑动切换
public class LcVpFragment extends Fragment{
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
List<Fragment> listviews = new ArrayList<Fragment>();
TransFragment trs = new TransFragment();
trs.setArguments(getArguments());//传参数
listviews.add(new NextPagerFragment());
listviews.add(trs);
listviews.add(new NextPagerFragment());
ViewPager myviewpage = (ViewPager)getActivity().findViewById(R.id.trans_page);
TransFragmentPagerAdapter mypagetadapter = new TransFragmentPagerAdapter(getActivity().getSupportFragmentManager(),listviews);
myviewpage.setAdapter(mypagetadapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.myviewpager, container, false);
//return super.onCreateView(inflater, container, savedInstanceState);
}
}
继承Fragment适配器FragmentPagerAdapter,Fragment的适配器比较简单
public class TransFragmentPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragments;
public TransFragmentPagerAdapter(FragmentManager fm,List<Fragment> _fragments)
{
super(fm);
this.fragments = _fragments;
}
public TransFragmentPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fragments.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragments.size();
}
}
二:利用viewpager滑动分页1(不推荐,使用setCurrentItem(1)始终效果不理想,而且滑动后需要重新加载数据)
滑动分页技巧,viewpager里边添加三个fragment,其中两个先显示进度条,
有三个fragment就可以向右向左滑动,以模拟上一页下一页,当滑动到其他页就加载数据,加载完后设置myviewpage.setCurrentItem(1),
就又可以进行左右滑动了,由于设置myviewpage.setCurrentItem(1)不要有滑动效果不然用户不友好,可以反射改变etCurrentItem(1)
的速度http://blog.csdn.net/aojiancc2/article/details/40427207
这里要主要几点,viewpager进行fragment管理时生命周期是比如ViewPager有5个page,刚打开的时候,会加载page1和page2.....,我们手动切换到page2的时候,会加载page3,切换到page3的时候,加载page4的同时会destory掉page1
所以不要想到滑动到下一页的时候会执行分页fragment的创建方法,应该自己写数据获得方法,自己在滑动结束事件里边调用
1:创建分页滑动viewpager主容器,这里也是一个fragment
public class LcVpFragment extends Fragment{
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
List<Fragment> listviews = new ArrayList<Fragment>();
ViewPager myviewpage = (ViewPager)getActivity().findViewById(R.id.trans_page);
TransFragment trs = new TransFragment();
trs.setArguments(getArguments());//传参数
NextPagerFragment next =new NextPagerFragment(myviewpage,trs);
next.setArguments(getArguments());
NextPagerFragment previous =new NextPagerFragment(myviewpage,trs);
previous.setArguments(getArguments());
listviews.add(previous);
listviews.add(trs);
listviews.add(next);
TransFragmentPagerAdapter mypagetadapter = new TransFragmentPagerAdapter(getActivity().getSupportFragmentManager(),listviews);
myviewpage.setAdapter(mypagetadapter);
myviewpage.setCurrentItem(1);
MyOnPageChangeListener mo = new MyOnPageChangeListener(myviewpage,listviews);
myviewpage.setOnPageChangeListener(mo);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.myviewpager, container, false);
}
}
2:为viewpager设置滑动事件这里很关键
class MyOnPageChangeListener implements OnPageChangeListener
{
int currentpage = 1;
ViewPager myviewpage;
List<Fragment> listviews;
public MyOnPageChangeListener(ViewPager _myviewpage,List<Fragment> _listviews)
{
listviews = _listviews;
myviewpage = _myviewpage;
}
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
public void onPageScrolled(int _current, float arg1, int arg2) {
}
public void onPageSelected(int _current) {
if(_current == 1)
return;
// TODO Auto-generated method stub
if(_current==0)//上一页
{
if(currentpage == 1)//已经是第一页了
{
myviewpage.setCurrentItem(1);
return;
}
currentpage--;
}
else if(_current==2)//下一页
{
currentpage++;
}
//获取到分页fragment执行GetData查询当前页数据,然后把数据传递到展示数据的fragment在进行切换即可
NextPagerFragment nex = (NextPagerFragment)listviews.get(_current);
nex.GetData(currentpage);
}
}
3:分页fragment
public class NextPagerFragment extends Fragment{
ViewPager myviewpage;
TransFragment trs;
public NextPagerFragment(ViewPager _myviewpage,TransFragment _trs)
{
myviewpage = _myviewpage;
trs = _trs;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
public void GetData(int current)
{
System.out.println("当前第几页:"+current);
String phpsession = getArguments().getString("laravel_session");
new TransportationData().getData_hp(phpsession,new Action()
{
public void action(String _data) {
Message message = new Message();
message.obj = _data;
handler.sendMessage(message);
}
},current);
}
@SuppressLint("HandlerLeak")
final Handler handler = new Handler(){
public void handleMessage(Message msg) {
trs.SetPageData(String.valueOf(msg.obj));//为数据展示的fragment加载数据
myviewpage.setCurrentItem(1);//然后进行切换
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.nextpager, container, false);
}
}
public class TransFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.mytable_trans, container, false);
//return super.onCreateView(inflater, container, savedInstanceState);
}
public void SetPageData(String _pagedata)
{
setData(String.valueOf(_pagedata));
}
public void setData(String _data)
{
//加载数据即可
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
GetData();
}
}
http://www.cnblogs.com/tiantianbyconan/p/3364728.html
http://www.2cto.com/kf/201404/292031.html
三:利用viewpager滑动分页2
其实viewpager添加多个fragment,利用他的加载方式可以很轻松的实现滑动分页
1:加载需要分页的fragment
for(int i=0;i<4;i++)
{
Bundle bu = new Bundle();
bu.putInt("cpage",i+1);
TransFragment trs = new TransFragment();
trs.setArguments(bu);
listviews.add(trs);
}
2:fragment
注意这里fragment所有的控件都要后台新生成,因为都是用的同一个类,如果加载同一个布局文件会有冲突
LinearLayout layout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
layout=new LinearLayout(getActivity());
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
layout.setOrientation(LinearLayout.VERTICAL);//显示方向
layout.setLayoutParams(params);
return layout;
//return inflater.inflate(R.layout.mytable_trans, container, false);
//return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
int cpage = getArguments().getInt("cpage");
GetData(cpage);
}
当然在需要的时候可以调用fragment集合,取出需要的fragment调用getdata方法,实现刷新,例如
public void onPageSelected(int _current) {
((CargoinfoFragment) listviews.get(_current)).GetData(_current);
}
当删除了需要刷新时,可以在FragmentActivity类重新加载一次分页的fragemt,但是要注意先把以前的删除掉,不能数据可能会错乱
public void switchContent(Fragment fragment,boolean isdelete) {
if(isdelete){
List<Fragment> li = getSupportFragmentManager().getFragments();
for(int i=0;i<li.size();i++)
{
Fragment f=li.get(i);
System.out.println("类型:"+f.getClass());
getSupportFragmentManager().beginTransaction().remove(f).commit();
}
}
try{
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.bt,fragment)
.addToBackStack("msg_fragment")//返回键不回来
.commit();
}
catch(Exception e)
{
System.out.println("主类调用异常:"+e);
}
}