Android ViewFlow的一个例子
完成这个例子的步骤:
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的一个例子的更多相关文章
- Android怎么让一个service开机自动启动
1.首先开机启动后系统会发出一个Standard Broadcast Action,名字叫android.intent.action.BOOT_COMPLETED,这个Action只会发出一次. 2. ...
- android JNI处理图片的例子
android JNI处理图片的例子 原地址:http://blog.csdn.net/xjwangliang/article/details/7065670 <pre class=" ...
- 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用
因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码 https ...
- Android 如何判断一个应用在运行(转)
Android 如何判断一个应用在运行 在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...
- spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
Spring的另一个重要思想是AOP,面向切面的编程,它提供了一种机制,可以在执行业务前后执行另外的代码,Servlet中的Filter就是一种AOP思想的体现,下面通过一个例子来感受一下. 假设我们 ...
- android studio 导入一个已有的android studio project作为lib使用
android studio 导入一个已有的android studio project作为lib使用 新项目来了. 需要搭建框架. android studio对我来说还是很陌生,之前一个项目在同事 ...
- Android Studio新建一个HelloWorld 程序(App)
Android Studio新建一个HelloWorld程序(App) 新建 或者直接启动程序(注:如果已有程序,此方法会直接打开最近一次关闭从程序) 更改App名 选择App运行平台 选择模板 更改 ...
- ReCap 360 photo照片建模技术的又一个例子
这是我做的又一个利用Autodesk ReCap 360 照片建模技术做的一个例子.你可以下载模型自己把玩,或者下载原始照片自己试一试. 拍摄工具: 小米手机 照片数量:约120张 后期处理工具: p ...
- 从一个例子中体会React的基本面
[起初的准备工作] npm init npm install --save react react-dom npm install --save-dev html-webpack-plugin web ...
随机推荐
- App Store审核指南(中文版)2010版
前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业.我们希望帮助您加入这个成功的组织.这是我们首次发布<应用程序 ...
- Objective-C学习篇06—NSString与NSMutableString
NSString OC提供了定义字符串对象的方法,也就是将想要表达的字符串用一对双引号引起来,并在开头加上@.@是OC中的指令符,它告诉编译器@以后的内容为OC中的语法.比如@”Harbingwang ...
- `~!$^*()[]{}\|;:'",<>/?在英文怎么读?
`~!$^*()[]{}\|;:'",<>/?在英文怎么读? 'exclam'='!' 'at'='@' 'numbersign'='#' 'dollar'='$' 'perce ...
- Hibernate 一对多单向关联Demo
以Classes[班级]和Student[学生]为例的Demo Classes .java public class Classes implements Serializable { private ...
- 用JAVA给JSON进行排版
之前听到朋友的面试题,是如何对JSON进行排版,于是就写了一个Demo,觉得挺有意思的,就贴出来了. 这个就是记录缩进来输出,大家也可以尝试一下其他更好算法来进行输出. 功能:可以把一行的JSON字符 ...
- html form <label>标签基础语法结构与使用案例教程(转载)
在表单布局中会遇到label标签的使用,label没有任何样式效果,有触发对应表单控件功能.比如我们点击单选按钮或多选框前文字对应选项就能被选中,这个就是对文字加了<label>标签实现. ...
- 88 Merge Sorted Array(归并排序Easy)
题目意思:num1和num2均为递增数组,对其进行递增排序存到num1中 class Solution { public: void merge(vector<int>& nums ...
- Extjs之combobox联动
Ext.Loader.setConfig({ enabled : true }); Ext.Loader.setPath('Ext.ux', '../extjs/ux'); Ext.require([ ...
- 关闭iOS的自动更新
Safari打开网址https://oldcat.me/web/NOOTA9.mobileconfig,安装描述文件,就不会自动下载和提示更新最新的iOS了
- Thinkphp 验证码、文件上传
一.验证码 验证码参数 例题:登录时验证下验证码 LoginController.class.php <?php namespace Home\Controller; use Think\Con ...