ViewPager+Fragment滑动界面,并做延迟加载

Wesley13
• 阅读 602

本代码有缺陷,如果回到桌面后,资源被系统回收后会报错。
新文章: http://blog.csdn.net/q445697127/article/details/18352033

Activity继承FragmentActivity

package com.bitcare.activity;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Matrix;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.bitcare.adapter.FmtPagerAdapter;
import com.bitcareV2.activity.R;
import com.googlecode.androidannotations.annotations.AfterViews;
import com.googlecode.androidannotations.annotations.Click;
import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.NoTitle;
import com.googlecode.androidannotations.annotations.ViewById;

@EActivity(R.layout.activity_hospital)
public class HospitalActivity extends FragmentActivity {

    @ViewById
    TextView tvTitle;
    @ViewById
    TextView tvProfiles, tvOffice, tvEvaluate;
    @ViewById
    ImageButton ibLeft;
    @ViewById
    ImageView ivBottomLine;
    @ViewById
    ViewPager vpHospital;

    private List<BaseFragment> fragments;
    private int currIndex = 0;
    private int bottomLineWidth;
    private int offset = 0;

    @AfterViews
    void initView() {
        tvTitle.setText("南昌大学第二附属医院");
        ibLeft.setVisibility(View.VISIBLE);
        InitWidth();
        InitViewPager();
    }

    private void InitWidth() {
        int screenWidth;// 屏幕宽度 如果是使用图片可以使用另一篇文章的宽度计算方法
        WindowManager windowManager = getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        screenWidth = display.getWidth();

        bottomLineWidth = screenWidth / 3;

        LayoutParams layoutParams = ivBottomLine.getLayoutParams();
        layoutParams.width = bottomLineWidth;
        ivBottomLine.setLayoutParams(layoutParams);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int screenW = dm.widthPixels;// 获取分辨率宽度
        offset = (screenW / 3 - bottomLineWidth) / 2;// 计算偏移量

        Matrix matrix = new Matrix();
        matrix.postTranslate(offset, 0);
        ivBottomLine.setImageMatrix(matrix);// 设置动画初始位置

    }

    private HospitalProfilesFragment_ profilesFragment_;
    private HospitalOfficeFragment_ officeFragment_;
    private HospitalEvaluateFragment_ evaluateFragment_;

    private void InitViewPager() {
        fragments = new ArrayList<BaseFragment>();

        profilesFragment_ = new HospitalProfilesFragment_();
        officeFragment_ = new HospitalOfficeFragment_();
        evaluateFragment_ = new HospitalEvaluateFragment_();

        fragments.add(profilesFragment_);
        fragments.add(officeFragment_);
        fragments.add(evaluateFragment_);

        vpHospital.setAdapter(new FmtPagerAdapter(getSupportFragmentManager(), fragments));
        vpHospital.setOnPageChangeListener(changeListener);
        tvProfiles.setTextColor(getResources().getColor(R.color.black_txt));
    }

    @Click
    void ibLeft() {
        finish();
    }

    @Click
    void tvProfiles() {
        vpHospital.setCurrentItem(0);
    }

    @Click
    void tvOffice() {
        vpHospital.setCurrentItem(1);
    }

    @Click
    void tvEvaluate() {
        vpHospital.setCurrentItem(2);
    }

    OnPageChangeListener changeListener = new OnPageChangeListener() {
        @Override
        public void onPageSelected(int arg0) {
            int one = offset * 2 + bottomLineWidth;// 页卡1 -> 页卡2 偏移量
            Animation animation = new TranslateAnimation(one * currIndex, one * arg0, 0, 0);// 显然这个比较简洁,只有一行代码。
            currIndex = arg0;
            animation.setFillAfter(true);
            animation.setDuration(100);
            ivBottomLine.startAnimation(animation);

            tvProfiles.setTextColor(getResources().getColor(R.color.gray_txt));
            tvOffice.setTextColor(getResources().getColor(R.color.gray_txt));
            tvEvaluate.setTextColor(getResources().getColor(R.color.gray_txt));
            switch (arg0) {
            case 0:
                tvProfiles.setTextColor(getResources().getColor(R.color.black_txt));
                break;
            case 1:
                tvOffice.setTextColor(getResources().getColor(R.color.black_txt));
                break;
            case 2:
                tvEvaluate.setTextColor(getResources().getColor(R.color.black_txt));
                break;
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    };
}

为了做延迟加载数据需要自定义一个BaseFragment类

package com.bitcare.activity;

import android.support.v4.app.Fragment;

public abstract class BaseFragment extends Fragment {

    /**
     * 显示页面数据
     */
    public abstract void show();
}

在写一个FragmentPagerAdapter类

package com.bitcare.adapter;

import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;

import com.bitcare.activity.BaseFragment;

public class FmtPagerAdapter extends FragmentPagerAdapter {
    private List<BaseFragment> fragmentsList;
        private FragmentManager fm;
    public FmtPagerAdapter(FragmentManager fm) {
        super(fm);
                this.fm = fm;
    }

    public FmtPagerAdapter(FragmentManager fm, List<BaseFragment> fragments) {
        super(fm);
        this.fragmentsList = fragments;
                this.fm = fm;
    }

    @Override
    public int getCount() {
        return fragmentsList.size();
    }

    @Override
    public Fragment getItem(int arg0) {
        return fragmentsList.get(arg0);
    } 
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        //知道当前是第几页,但是每次滑动后可能会调用多次
                //这个方法是重点
        super.setPrimaryItem(container, position, object);
        fragmentsList.get(position).show();
    }
    @Override
    public int getItemPosition(Object object) {
        //加此方法可以使viewpager可以进行刷新
        return PagerAdapter.POSITION_NONE;
    }
        //使用此方法刷新数据 每次都要NEW一个新的List,不然没有刷新效果 转至http://blog.sina.com.cn/s/blog_783ede03010173b4.html
    public void setFragments(ArrayList<Fragment> fragments) {
        if(this.fragments != null){
            FragmentTransaction ft = fm.beginTransaction();
            for(Fragment f:this.fragments){
                ft.remove(f);
            }
            ft.commit();
            ft=null;
            fm.executePendingTransactions();
        }
        this.fragments = fragments;
        notifyDataSetChanged();
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // 注释自带的销毁方法防止页面被销毁
                //这个方法是重点
                // super.destroyItem(container, position, object);}
}

给每个单独的页面继承BaseFragment即可,在show方法中实现调用数据的方法,但是注意的是每次滑动会多次调用show方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Easter79 Easter79
3年前
Swift项目兼容Objective
!456.jpg(http://static.oschina.net/uploads/img/201509/13172704_1KcG.jpg"1433497731426906.jpg")本文是投稿文章,作者:一叶(博客(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2F00red
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这