完成这个例子的步骤:

1.下载ViewFlow的源码,然后将类ViewFlow放在自己的工程的src的某个包下。

2.下载的源码里有2个工程view flow,viewflow-example。将view flow工程里的attr

3.布局文件如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/home_layout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<RelativeLayout

android:id="@+id/home_headerLayout"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="9" >

<Button

android:id="@+id/memo_type_edit_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:layout_centerVertical="true"

android:layout_margin="4dip"

android:background="@drawable/button_bg_select_type"

android:padding="3dip" />

<Button

android:id="@+id/memo_type_btn"

android:layout_width="100dip"

android:layout_height="35dip"

android:layout_centerInParent="true"

android:layout_margin="4dip"

android:background="@drawable/button_bg_down"

android:gravity="center"

android:singleLine="true"

android:text="工作(10)"

android:textColor="@color/white"

android:textSize="18sp"

android:textStyle="bold" />

<Button

android:id="@+id/new_memo_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:layout_margin="4dip"

android:background="@drawable/button_bg_add" />

</RelativeLayout>

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1"

android:orientation="vertical" >

<RelativeLayout

android:id="@+id/kitty"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1"

android:orientation="vertical" >

<FrameLayout

xmlns:app="http://schemas.android.com/apk/res/com.bst.memo.activity"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<com.lx.viewflow.ViewFlow               <!-- 这个类就是拷贝下载的ViewFlow类 -->

android:id="@+id/home_viewflow"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_marginTop="25dip" />

<com.lx.viewflow.CircleFlowIndicator   <!-- 这个类也是下载的工程viewflow中的 -->

android:id="@+id/viewflowindic"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

app:fadeOut="1000"

app:inactiveType="fill"

android:paddingTop="10dip" />

</FrameLayout>

<ImageView

android:id="@+id/setting"

android:layout_width="24dip"

android:layout_height="24dip"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:layout_marginBottom="10dip"

android:layout_marginRight="10dip"

android:src="@drawable/i" />

</RelativeLayout>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/adlayout"

android:layout_width="wrap_content"

android:layout_height="50dip"

android:layout_gravity="center"

android:background="@drawable/adbg" >

</LinearLayout>

</LinearLayout>

</LinearLayout>

4.为ViewFlow写一个适配器:

public class ViewFlowAdapter extends BaseAdapter implements OnItemClickListener {

private LayoutInflater mInflater;

private MemoActivity memoActivity;    //主Activity

private int selectedPosition = 0;

private List<List<MemoBean>> list =new ArrayList<List<MemoBean>>();   //要显示在ViewFlow中的数据

public GalleryAdapter(MemoActivity activity, List<MemoBean> memoBeanList) {

memoActivity = activity;

mInflater = LayoutInflater.from(activity);

initList(memoBeanList);

}

public void setSelectedPosition(int position) {

this.selectedPosition = position;

}

public void updateData(List<MemoBean> memoBeanList) {

if(list!=null){

list.clear();

}

initList(memoBeanList);

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

//初始化ViewFlow的各个页的数据

private void initList(List<MemoBean> memoBeanList){

if(memoBeanList==null){

return;

}

int totalCount = memoBeanList.size();

int pages =0;

if(totalCount%Config.PAGE_SIZE==0){

pages = totalCount/Config.PAGE_SIZE;       //Config.PAGE_SIZE控制每页显示多少个

}else{

pages = totalCount/Config.PAGE_SIZE+1;

}

for(int i=1;i<=pages;i++){

list.add(getCurrentPageList(i,memoBeanList));

}

}

//获取当前页的数据

private List<MemoBean> getCurrentPageList(int page,List<MemoBean> memoBeanList) {

List<MemoBean> list = new ArrayList<MemoBean>();

if(memoBeanList!=null && memoBeanList.size()>0){

int totalCount = memoBeanList.size();

int start = 0;

int end = 0;

start = (page - 1) * Config.PAGE_SIZE;

end = start + Config.PAGE_SIZE;

if (end > totalCount) {

end = totalCount;

}

for (int i = start; i < end; i++) {

list.add(memoBeanList.get(i));

}

}

return list;

}

//释放ViewFlow占的资源

public void releaseViewFlow(int currentPosition, ViewFlow viewFlow) {

List<View> views = viewFlow.mLoadedViews;

int size = views.size();

for (int i = 0; i < size; i++) {

if (i != currentPosition){   //我的ViewFlow的每一页对应的布局是一个LinearLayout,LinearLayout里面有个GridView

LinearLayout layout = (LinearLayout) views.get(i);

GridView gridView = (GridView) layout.getChildAt(0);

GridViewAdapter adapter = (GridViewAdapter) gridView.getAdapter();

adapter.clear();    //释放GridView占用的资源

System.gc();

}

}

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

List<MemoBean> memos = list.get(position);

//viewflow_page这个布局对应的就是每页该怎么展示的布局,一个包含GridView的LinearLayout,

convertView = mInflater.inflate(R.layout.viewflow_page, null);

GridView gridView = (GridView) convertView.findViewById(R.id.gridview);

gridView.setOnItemClickListener(this);

GridViewAdapter adapter = (GridViewAdapter) gridView.getAdapter();

if (adapter == null) {

adapter = new GallaryItemAdapter(memoActivity, memos);

gridView.setAdapter(adapter);

} else {

adapter.setMemoList(memos);

adapter.notifyDataSetChanged();

}

}

return convertView;

}

//点击每页里面的GridView的Item的处理

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

memoActivity.finish();

Intent intent = new Intent();

intent.setClass(memoActivity, EditActivity.class);

MemoBean memoBean = (MemoBean) ((GridView) parent)

.getItemAtPosition(position);

MemoTypeBean typeBean = new MemoTypeBean(memoActivity);

typeBean = typeBean.getBean(memoBean.getMemoTypeId());

Bundle bundle = new Bundle();

bundle.putSerializable("memo_bean", memoBean);

bundle.putSerializable("type_id", MemoActivity.selectedTypeId);

int start = selectedPosition* Config.PAGE_SIZE+position;

bundle.putInt("current_position", start);

intent.putExtras(bundle);

memoActivity.startActivity(intent);

}

public void clear(){

list.clear();

list=null;

}

}

5.主Activity  MemoActivity的初始化ViewFlow代码:

mViewFlow = (ViewFlow) findViewById(R.id.home_viewflow);

List<MemoBean> memoList = myMemoBean.getMemoListByType(selectedTypeId);

ViewFlowAdapter adapter = new GalleryAdapter(this, memoList);

mViewFlow.setAdapter(adapter);

if(memoList!=null && memoList.size()>0){

mViewFlow.setSelection(0);

}

6.效果图

注意点:

由于在ViewFlow中的onMeasure方法里,有下面这段代码:

if (widthMode != MeasureSpec.EXACTLY && !isInEditMode()) {

throw new IllegalStateException(

"ViewFlow can only be used in EXACTLY mode.");

}

final int heightMode = MeasureSpec.getMode(heightMeasureSpec);

if (heightMode != MeasureSpec.EXACTLY && !isInEditMode()) {

throw new IllegalStateException(

"ViewFlow can only be used in EXACTLY mode.");

}

所以布局时,ViewFlow的layout_width,layout_height是属于确定的模式。按layout_weight来写,或按dip来写死。

Android ViewFlow的一个例子的更多相关文章

  1. Android怎么让一个service开机自动启动

    1.首先开机启动后系统会发出一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED,这个Action只会发出一次. 2. ...

  2. android JNI处理图片的例子

    android JNI处理图片的例子 原地址:http://blog.csdn.net/xjwangliang/article/details/7065670 <pre class=" ...

  3. 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用

    因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码  https ...

  4. Android 如何判断一个应用在运行(转)

    Android 如何判断一个应用在运行  在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...

  5. spring笔记--使用springAPI以及自定义类 实现AOP的一个例子

    Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...

  6. android studio 导入一个已有的android studio project作为lib使用

    android studio 导入一个已有的android studio project作为lib使用 新项目来了. 需要搭建框架. android studio对我来说还是很陌生,之前一个项目在同事 ...

  7. Android Studio新建一个HelloWorld 程序(App)

    Android Studio新建一个HelloWorld程序(App) 新建 或者直接启动程序(注:如果已有程序,此方法会直接打开最近一次关闭从程序) 更改App名 选择App运行平台 选择模板 更改 ...

  8. ReCap 360 photo照片建模技术的又一个例子

    这是我做的又一个利用Autodesk ReCap 360 照片建模技术做的一个例子.你可以下载模型自己把玩,或者下载原始照片自己试一试. 拍摄工具: 小米手机 照片数量:约120张 后期处理工具: p ...

  9. 从一个例子中体会React的基本面

    [起初的准备工作] npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web ...

随机推荐

  1. Asp.net 菜单控件

    本文介绍的菜单控件采用的css 和ul list来显示菜单,生成的html小,无需javascript支持,对大部分的浏览器都支持,除ie6要单独修改css也可以使其支持. 通过本文可以了解asp.n ...

  2. WPF命令

    WPF的命令是经常使用的,在MVVM中,RelayCommand更是用得非常多,但是命令的本质究竟是什么,有了事件为什么还要命令,命令与事件的区别是什么呢?MVVM里面是如何包装命令的呢?命令为什么能 ...

  3. WebService笔记-Schema约束

                        Schema约束 俗话说得好 好记性不如烂笔头. 看了下WebService视频,觉得还是得下笔记. 观看的视频地址:http://edu.51cto.com/ ...

  4. DOM4J 读取XML配置文件进行数据库连接

        介绍介绍DOM4J.    据说是非常优秀非常优秀的Java XML  API(Dom4j is an easy to use, open source library for working ...

  5. Best Time to Buy and Sell sock II

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  6. 试用ubuntu-12.04.3-desktop-amd64(二)

    首先说明,采用主机+虚拟机+ubuntu的形式,更具体的则为Win7-64bit + VMWare + ubuntu-12.04.3-desktop-amd64 进入ubuntu后首先考虑到的就是怎么 ...

  7. 兄弟连王牌PHP课程送三重豪礼啦!

    兄弟连PHP就业办课程送三重豪礼啦! 惊喜一:报名9月23日班级,保障薪资直涨1000元! 9月报名学习,春节后就业,正是企业招聘的黄金高峰期,一年中拿到高薪最好的时节! 惊喜二:兄弟连云课堂900元 ...

  8. MySql存储过程—2、第一个MySql存储过程的建立

    看看如何创建一个存储过程.虽然通过命令行可以创建,但基本通过MySQL提供的Query browser来创建. 1.首先我们通过Administrator在test数据库中创建一个简单的表名叫”pro ...

  9. python模块之time和datetime

    33.python模块之time      1.>>> time.time() 1470900847.8458395 ==>时间戳,从1970年到现在.      2.> ...

  10. Android之Activity生命周期简介

    概述 有图有真相,所以先上图: 上图是从Android官网截下的Activity的生命周期流程图,结构非常清晰,它描述了Activity在其生命周期中所有可能发生的情况以及发生的先后顺序,下面就将结合 ...