android控制文件:ViewPager+Fragment+GridView使用(与AndroidQuery框架结合)
最近我看到一个AndroidQuery该框架。里面Demo,有一个屏幕,让博主喜欢。很顺利的左右滑动,感觉非常好,所以拿来和大家分享一下。看看结果图。:
从图中能够看出。上面的布局是一个Layout里面嵌套有个ViewPager,ViewPager中包括着Fragment,Fragment的布局文件包括了一个简单的GridView,GridView的Item布局非常easy。就是一个100*100大小的图片。好啦。先说这么多,然后咱们看代码吧。
最外层Activity的布局文件
<? xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Display 10x100 images from Picasa." /> <android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" > <android.support.v4.view.PagerTabStrip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</android.support.v4.view.ViewPager> </LinearLayout>
对应的Activity的java文件:(使用了AndroidAnnotation框架)
/*
* $filename: ImageLoadingPageGridActivity.java,v $
* $Date: 2014-5-3 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb; import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.NoTitle;
import org.androidannotations.annotations.ViewById; import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
/*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: zhb931706659@126.com
*2014-5-3 Nanjing,njupt,China
*/
@NoTitle
@EActivity(R.layout.image_page_grid_activity)
public class ImageLoadingPageGridActivity extends FragmentActivity{ @ViewById
ViewPager pager; PageAdapter adapter; @AfterViews
void afterViews(){
adapter = new PageAdapter(getSupportFragmentManager(),ImageLoadingPageGridActivity.this);
pager.setAdapter(adapter);
pager.setOffscreenPageLimit(3);//设置缓存视图的数目
}
}
大家注意:setOffscreenPageLimit的參数设置,数目越大,缓存的越多。切换的时候,载入的越快。
但,并非越大越好,内存中缓存的越多,消耗的手机资源就越多。
以下看一下PageAdapter的代码
/*
* $filename: PageAdapter.java,v $
* $Date: 2014-5-3 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb; import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.util.Log;
import android.view.ViewGroup; /*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: zhb931706659@126.com
*2014-5-3 Nanjing,njupt,China
*/
public class PageAdapter extends FragmentStatePagerAdapter { private static String[] topics = { "dog", "cat", "bird", "panda", "horse",
"elephant", "bear", "butterfly", "monkey", "fish", "tiger",
"chicken", "pig" }; Context context; public PageAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
} @Override
public Fragment getItem(int pos) {
Log.d("primary", topics[pos]);
Bundle args = new Bundle();
args.putString("topic", topics[pos]);
ImageGridFragment fragment = (ImageGridFragment) Fragment.instantiate(
context, ImageGridFragment.class.getName(), args);
return fragment;
} @Override
public int getCount() {
return topics.length;
} @Override
public CharSequence getPageTitle(int pos) {
return topics[pos];
} @Override
public void setPrimaryItem(ViewGroup container, int position, Object object) { Log.d("primary", topics[position]); ImageGridFragment fragment = (ImageGridFragment) object;
fragment.init(); } @Override
public void destroyItem(ViewGroup container, int position, Object object) {
Log.d("destroyItem", topics[position]);
} }
从上面的额PageAdapter的代码能够看出,里面总共同拥有13个页面。也就是左右滑动的时候,有13个Fragment。这里,注意一下getItem方法。它返回的是一个ImageGridFragment,而且向该Fragment中传递了键为topic的键值对。
以下看一下对应的ImageGridFragment的java文件和布局文件:
package edu.njupt.zhb; import java.util.ArrayList;
import java.util.List; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter; import com.androidquery.AQuery;
import com.androidquery.callback.AjaxStatus;
import com.androidquery.util.AQUtility;
import com.androidquery.util.XmlDom; public class ImageGridFragment extends Fragment { private AQuery aq;
private AQuery aq2; private String topic;
private List<Photo> photos; @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.image_grid_fragment, container,
false);
aq = new AQuery(getActivity(), view);
aq2 = new AQuery(getActivity());
Log.d("ViewPagerDemo","onCreateView...");
return view; } @Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
topic = getArguments().getString("topic");
Log.d("ViewPagerDemo","onActivityCreated...");
}
private boolean inited; public void init() {
if (aq == null || inited)
return;
inited = true;
Log.d("ViewPagerDemo","init...");
refresh();
} public void refresh() {
ajaxPhotos();
} private void ajaxPhotos() {
String url = "https://picasaweb.google.com/data/feed/api/all?q="
+ topic + "&max-results=100";
aq.progress(R.id.progress).ajax(url, XmlDom.class, 0, this, "photosCb");
} public void photosCb(String url, XmlDom xml, AjaxStatus status) { if (xml != null) {
photos = convertAll(xml);
render(photos);
} } private void render(List<Photo> entries) { AQUtility.debug("render setup");
ArrayAdapter<Photo> aa = new ArrayAdapter<Photo>(getActivity(),
R.layout.grid_item2, entries) {
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) {
convertView = aq.inflate(convertView, R.layout.grid_item2,
parent);
}
Photo photo = getItem(position);
AQuery aq = aq2.recycle(convertView);
String tbUrl = photo.tb;
if (aq.shouldDelay(position, convertView, parent, tbUrl)) {
aq.id(R.id.tb).clear();
} else {
aq.id(R.id.tb).image(tbUrl, true, true, 200,
R.drawable.image_missing, null, 0, 0);
}
return convertView;
}
};
aq.id(R.id.grid).adapter(aa);
} private List<Photo> convertAll(XmlDom xml) {
List<XmlDom> entries = xml.children("entry");
List<Photo> result = new ArrayList<Photo>();
for (XmlDom entry : entries) {
result.add(convert(entry));
}
return result;
} private Photo convert(XmlDom xml) {
String url = xml.child("content").attr("src");
String title = xml.child("title").text();
String author = xml.child("author").text("name");
String tb = url;
List<XmlDom> tbs = xml.tags("media:thumbnail");
if (tbs.size() > 0) {
// tb = tbs.get(0).attr("url");
tb = tbs.get(tbs.size() - 1).attr("url");
}
tb = tb.replaceAll("https:", "http:");
Photo photo = new Photo();
photo.url = url;
photo.tb = tb;
photo.title = title;
photo.author = author;
return photo;
} class Photo { String tb;
String url;
String title;
String author;
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
> <GridView
android:id="@+id/grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="90dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/> <ProgressBar
android:id="@+id/progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone"
/> </RelativeLayout>
注意:ImageGridFragment的init方法是在PageAdapter中调用的。本Demo中,init是直接使用AQuery从网络上获取对应的资源。而对于实际的项目,我们首先检查本地数据库是否有对应的资源,假设有,先载入。其次,向网络中获取。查看是否有更新,如有更新。就再在原来的基础上。加入数据。
整个项目中得比較关键的布局就这么多。整个项目下载地址:http://download.csdn.net/detail/nuptboyzhb/7287219
android发展联盟QQ组:272209595
版权声明:本文博客原创文章。博客,未经同意,不得转载。
android控制文件:ViewPager+Fragment+GridView使用(与AndroidQuery框架结合)的更多相关文章
- android 中的 ViewPager+ Fragment
android的Viewpager 的各种经常的用法,朋友问我要过,所以就稍微总结一下, ViewPager + Fragment 经常用到 代码是从 actionbarsherlock 中提取 ...
- Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版
描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了 ...
- Android之实现ViewPager+Fragment左右滑动
近期看新闻发现新闻的页面是能够左右滑动的.于是自己就好奇起来了,之前做过ViewPager展示图片,在想怎么载入页面呢?研究了一下.发现就是加入了Fragment,废话不多说,揭秘奥秘的时候到了. 使 ...
- Android 代码实现viewPager+fragment 模仿今日头条的顶部导航
模仿今日头条的顶部导航: 下载地址: http://download.csdn.net/detail/u014608640/9917700 效果图:
- Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- Android主页导航:fragment+viewpager
简单实现Fragment+ViewPager实现主页导航控制,效果如下: 一.activity_main.xml布局文件: <?xml version="1.0" encod ...
- Android - ViewPager+Fragment初始化问题
Android应用开发中,经常会用到ViewPager + Fragment,虽然效果不错,但随之而来的还有一些问题,下面就说说其中的初始化问题. ViewPager初始化时会预加载前后的2个页面,即 ...
- Android Viewpager+Fragment实现滑动标签页
ViewPager 结合Fragment实现一个Activity里包含多个可滑动的标签页,每个标签页可以有独立的布局及响应. 主页布局 <?xml version="1.0" ...
- Android流行界面结构——Fragment通过ViewPager(带指示器)嵌套Fragment结构的创建方法详解
原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6287213.html 当前Android流行界面结构的一种——Fragment通过ViewPage ...
随机推荐
- [INS-32052] Oracle基文件夹和Oracle主文件夹位置同样
1.错误描写叙述 [INS-32052] Oracle基文件夹和Oracle主文件夹位置同样 2.错误原因 Oracle基文件夹和Oracle主文件夹位置同样 3.解决的方法 Oracle ...
- ArcPad 10 的安装部署
ArcPad是安装在手持设备或者移动终端的一个外业ArcGIS产品,也就是说ArcPad是Esri的一款软件产品,而不是硬件设备哦.尽管不比ArcGIS Desktop功能复杂缤纷,可是对于野外作业. ...
- JAVA 公众微信的开放源码项目管理合作伙伴招募的版本号
大家好: jeecg开源社区.现在正在进行"JAVA 开放源码的版本号项目微信公共账号"工作,有兴趣的朋友一起參与. 截止时间:20140510 採用技术: 1. JE ...
- Visual Studio 使用及调试必知必会
原文:Visual Studio 使用及调试必知必会 一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2: ...
- 使用autoconf和automake生成Makefile文件(转)
Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...
- 图片切割工具---产生多个div切割图片 采用for和一的二维阵列设置背景位置
照片库 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb21vZ2c=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 第十七章——配置SQLServer(3)——配置“对即时负载的优化”
原文:第十七章--配置SQLServer(3)--配置"对即时负载的优化" 前言: 在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中.在很多 ...
- poj 1975 Median Weight Bead(传递闭包 Floyd)
链接:poj 1975 题意:n个珠子,给定它们之间的重量关系.按重量排序.求确定肯定不排在中间的珠子的个数 分析:由于n为奇数.中间为(n+1)/2,对于某个珠子.若有至少有(n+1)/2个珠子比它 ...
- Duanxx的Altium Designer学习:PCB试想一下,在目前的水平
1 Shift+S 这个快捷键能高亮当前层,而且使其它层变成灰色.见下图: 2 隐藏指定层 在图中右下角的地方,右键.会弹出一个选项条.选择Hide Layers.能够选择想要隐藏的 ...
- head first c<11>在根据网络编程
博文可以在一个大的网络通信实现,但是,一个人只能起到,我们能够给每个clientfork()子进程,实现诸多的服务. 方法: client连到server以后,server启动一个新创建的套接字对话. ...