一般情况的界面搭建和数据的填充
2016-11-05 10:55
169 查看
# 新闻中心缓存数据
NewscenterPager
流程:
1、访问网络前先获取缓存
2、获取到缓存就展示数据
3、访问网络获取数据
3.1、缓存数据
3.2、展示数据
public void initData() {
System.out.println("新闻中心加载数据了");
tv_basepager_title.setText("新闻中心");
// 访问网络之前先展示缓存数据
String cacheJson = CacheUtil.getString(mContext, NEWSCENTER_CACHE_JSON, "");
if(!TextUtils.isEmpty(cacheJson)){
// 有缓存数据,展示数据
parseJson(cacheJson);
}
// 加载新闻中心 数据
getDataFromServer();
}
public void onSuccess(ResponseInfo<String> responseInfo) {
System.out.println("访问新闻中心成功:" + responseInfo.result);
// 缓存新闻中心json数据
CacheUtil.putString(mContext, NEWSCENTER_CACHE_JSON, responseInfo.result);
parseJson(responseInfo.result);
}
去掉HttpUtils的默认缓存
// 默认缓存数据,60s之内,访问同一个url,去拿缓存数据
// httpUtils.send(HttpMethod.GET, ConstantUtil.NEWSCENTER_URL+"?"+System.currentTimeMillis(), new RequestCallBack<String>() {
// 设置Xutils的缓存时间改为0
httpUtils.configDefaultHttpCacheExpiry(0);
# 最外层ViewPager事件冲突
不需要最外层ViewPager拦截事件
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 干掉处理事件的默认行为
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
// 不让拦截孩子的事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
# SlidingMenu抢ViewPagerIndicator的事件
在TabPageIndicator的dispatchTouchEvent方法请求父容器不要拦截事件
public boolean dispatchTouchEvent(MotionEvent ev) {
// 前提 所有的ViewGroup,默认都至少把down事件传递下来
// 请求父容器不拦截事件
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
# SlidingMenu抢新闻详情中ViewPager的事件
通过SlidingMenu提供的设置触摸范围方法setTouchModeAbove解决
NewsDetailPager
public void initData() {
pager.setAdapter(new MyAdapter());
// 关联indicator和ViewPager
indicator.setViewPager(pager);
// 监听ViewPager,让他显示第1页时,才让侧滑菜单处理事件
// pager.setOnPageChangeListener(new MyOnPageChangeListener());
// 必须把OnPageChangeListener设置给Indicator
indicator.setOnPageChangeListener(new MyOnPageChangeListener());
}
public void onPageSelected(int position) {
// 显示第1页时,才让侧滑菜单处理事件,其他界面禁止侧滑菜单的滑动
MainUI mainUI = (MainUI) mContext;
SlidingMenu slidingMenu = mainUI.getSlidingMenu();
if(position==0){
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
# 展示页签详情
新闻详情界面中有多少几个页签标题,对应就有多少个页签详情界面,且这些界面布局功能都一样,用一个类(TabDetailPager)来代表,让他继承MenuBasePager,就能提供返回布局和更新布局的方法。
初始化页签详情集合
public void initData() {
// 初始化页签详情界面对象
tabPagers = new ArrayList<TabDetailPager>();
for(int i= 0;i<mData.size();i++){
tabPagers.add(new TabDetailPager(mContext,mData.get(i)));
}
pager.setAdapter(new MyAdapter());
...下面代码省略
}
新闻详情(NewsDetailPager)中的ViewPager的instantiateItem方法
public Object instantiateItem(ViewGroup container, int position) {
// 根据位置获取相应的页签详情对象
TabDetailPager tabDetailPager = tabPagers.get(position);
container.addView(tabDetailPager.rootView);
tabDetailPager.initData();
return tabDetailPager.rootView;
}
生成json类工具使用
每次使用时,必须点击编辑规则,点击确定生效。(如果报错,把GsonEntityTools.xml的只读勾掉)
拷贝json数据到输入框后,点击确认提交,拷贝生成的java内容。
# 轮播图处理事件冲突
HorizontalScrollViewPager
public boolean dispatchTouchEvent(MotionEvent ev) {
// 请求父容器不要拦截事件
// getParent().requestDisallowInterceptTouchEvent(true);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
downY = (int) ev.getY();
// 在down时请求父容器不拦截事件,是为了把剩下的事件传递下来
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) ev.getX();
int moveY = (int) ev.getY();
int diffX = moveX - downX;
int diffY = moveY - downY;
// 1、不处理上下滑动
if(Math.abs(diffX)<Math.abs(diffY)){
getParent().requestDisallowInterceptTouchEvent(false);
}
// 2、左右滑动
else{
// 2.1、第1页时,且手指从左往右,不处理事件
if(getCurrentItem()==0&&diffX>0){
getParent().requestDisallowInterceptTouchEvent(false);
}
// 2.2、最后一页时,且手指从右往左,不处理事件
else if(getCurrentItem()==getAdapter().getCount()-1&&diffX<0){
getParent().requestDisallowInterceptTouchEvent(false);
}
// 2.3、其他情况,自己处理事件
else{
getParent().requestDisallowInterceptTouchEvent(true);
}
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
# Xutils展示图片
// 展示图片
// BitmapUtils bitmapUtils = new BitmapUtils(mContext);// 每次new对象时,都会创建内存空间,new多个会导致内存溢出,需要实现单例(BitmapUtilsHelp)
// 设置图片缩放类型
imageView.setScaleType(ScaleType.CENTER_CROP);
bitmapUtils.display(imageView, topnewsData.get(position).topimage);
# 轮播图中设置图片描述
在ViewPager的监听器中
public void onPageSelected(int position) {
// 当轮播图滑动时,根据滑动的位置更新图片描述
tv_tabdetail_info.setText(topnewsData.get(position).title);
}
在parseJson方法中初始化第一个图片描述
// 初始化轮播图第一页的图片描述
tv_tabdetail_info.setText(topnewsData.get(0).title);
# 轮播图中设置红点指示器
在parseJson方法中初始化白点
for(int i= 0;i<topnewsData.size();i++){
ImageView imageView = new ImageView(mContext);
imageView.setBackgroundResource(R.drawable.tabdetail_point_selector);
LayoutParams params = new LayoutParams(5, 5);
imageView.setLayoutParams(params);
params.leftMargin = 10;
imageView.setEnabled(false);
// 把创建的点添加到容器中
ll_tabdetail_points.addView(imageView);
}
// 初始化轮播图中第一个红点
ll_tabdetail_points.getChildAt(0).setEnabled(true);
滑动ViewPager时,让红点根据位置变化
在ViewPager的监听器中
public void onPageSelected(int position) {
// 把前一个红点变白色
ll_tabdetail_points.getChildAt(preRedPointIndex).setEnabled(false);
// 当轮播图滑动时,根据滑动的位置更新图片描述
tv_tabdetail_info.setText(topnewsData.get(position).title);
// 当轮播图滑动时,把相应位置的点变红色
ll_tabdetail_points.getChildAt(position).setEnabled(true);
preRedPointIndex = position;
}
轮播图从北京滑到国际后,再回到北京时,红点不能随手指滑动把相应位置的点变红,因为北京这个TabDetailPager对象没有销毁,他的成员变量还是之前的值,需要再次显示北京时,把preRedPointIndex归为0
在parseJson方法中
// 当重新展示某一个页签详情界面时,重新把前一个红点位置归零
preRedPointIndex = 0;
# 更新新闻列表
// 更新新闻列表-----------------------------------
newsData = tabDetailBean.data.news;
lv_tabdetail_news.setAdapter(new NewsAdapter());
tabdetail_newsitem.xml中给图片设置边缘效果是通过background、src和padding共同完成
<ImageView
android:id="@+id/iv_newsitem_img"
android:layout_width="100dp"
android:layout_height="60dp"
android:background="#33000000"
android:padding="1dp"
android:scaleType="fitXY"
android:src="@drawable/item_default" />
NewscenterPager
流程:
1、访问网络前先获取缓存
2、获取到缓存就展示数据
3、访问网络获取数据
3.1、缓存数据
3.2、展示数据
public void initData() {
System.out.println("新闻中心加载数据了");
tv_basepager_title.setText("新闻中心");
// 访问网络之前先展示缓存数据
String cacheJson = CacheUtil.getString(mContext, NEWSCENTER_CACHE_JSON, "");
if(!TextUtils.isEmpty(cacheJson)){
// 有缓存数据,展示数据
parseJson(cacheJson);
}
// 加载新闻中心 数据
getDataFromServer();
}
public void onSuccess(ResponseInfo<String> responseInfo) {
System.out.println("访问新闻中心成功:" + responseInfo.result);
// 缓存新闻中心json数据
CacheUtil.putString(mContext, NEWSCENTER_CACHE_JSON, responseInfo.result);
parseJson(responseInfo.result);
}
去掉HttpUtils的默认缓存
// 默认缓存数据,60s之内,访问同一个url,去拿缓存数据
// httpUtils.send(HttpMethod.GET, ConstantUtil.NEWSCENTER_URL+"?"+System.currentTimeMillis(), new RequestCallBack<String>() {
// 设置Xutils的缓存时间改为0
httpUtils.configDefaultHttpCacheExpiry(0);
# 最外层ViewPager事件冲突
不需要最外层ViewPager拦截事件
public class NoScrollViewPager extends ViewPager {
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// 干掉处理事件的默认行为
@Override
public boolean onTouchEvent(MotionEvent ev) {
return true;
}
// 不让拦截孩子的事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}
# SlidingMenu抢ViewPagerIndicator的事件
在TabPageIndicator的dispatchTouchEvent方法请求父容器不要拦截事件
public boolean dispatchTouchEvent(MotionEvent ev) {
// 前提 所有的ViewGroup,默认都至少把down事件传递下来
// 请求父容器不拦截事件
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}
# SlidingMenu抢新闻详情中ViewPager的事件
通过SlidingMenu提供的设置触摸范围方法setTouchModeAbove解决
NewsDetailPager
public void initData() {
pager.setAdapter(new MyAdapter());
// 关联indicator和ViewPager
indicator.setViewPager(pager);
// 监听ViewPager,让他显示第1页时,才让侧滑菜单处理事件
// pager.setOnPageChangeListener(new MyOnPageChangeListener());
// 必须把OnPageChangeListener设置给Indicator
indicator.setOnPageChangeListener(new MyOnPageChangeListener());
}
public void onPageSelected(int position) {
// 显示第1页时,才让侧滑菜单处理事件,其他界面禁止侧滑菜单的滑动
MainUI mainUI = (MainUI) mContext;
SlidingMenu slidingMenu = mainUI.getSlidingMenu();
if(position==0){
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}else{
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
}
# 展示页签详情
新闻详情界面中有多少几个页签标题,对应就有多少个页签详情界面,且这些界面布局功能都一样,用一个类(TabDetailPager)来代表,让他继承MenuBasePager,就能提供返回布局和更新布局的方法。
初始化页签详情集合
public void initData() {
// 初始化页签详情界面对象
tabPagers = new ArrayList<TabDetailPager>();
for(int i= 0;i<mData.size();i++){
tabPagers.add(new TabDetailPager(mContext,mData.get(i)));
}
pager.setAdapter(new MyAdapter());
...下面代码省略
}
新闻详情(NewsDetailPager)中的ViewPager的instantiateItem方法
public Object instantiateItem(ViewGroup container, int position) {
// 根据位置获取相应的页签详情对象
TabDetailPager tabDetailPager = tabPagers.get(position);
container.addView(tabDetailPager.rootView);
tabDetailPager.initData();
return tabDetailPager.rootView;
}
生成json类工具使用
每次使用时,必须点击编辑规则,点击确定生效。(如果报错,把GsonEntityTools.xml的只读勾掉)
拷贝json数据到输入框后,点击确认提交,拷贝生成的java内容。
# 轮播图处理事件冲突
HorizontalScrollViewPager
public boolean dispatchTouchEvent(MotionEvent ev) {
// 请求父容器不要拦截事件
// getParent().requestDisallowInterceptTouchEvent(true);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = (int) ev.getX();
downY = (int) ev.getY();
// 在down时请求父容器不拦截事件,是为了把剩下的事件传递下来
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) ev.getX();
int moveY = (int) ev.getY();
int diffX = moveX - downX;
int diffY = moveY - downY;
// 1、不处理上下滑动
if(Math.abs(diffX)<Math.abs(diffY)){
getParent().requestDisallowInterceptTouchEvent(false);
}
// 2、左右滑动
else{
// 2.1、第1页时,且手指从左往右,不处理事件
if(getCurrentItem()==0&&diffX>0){
getParent().requestDisallowInterceptTouchEvent(false);
}
// 2.2、最后一页时,且手指从右往左,不处理事件
else if(getCurrentItem()==getAdapter().getCount()-1&&diffX<0){
getParent().requestDisallowInterceptTouchEvent(false);
}
// 2.3、其他情况,自己处理事件
else{
getParent().requestDisallowInterceptTouchEvent(true);
}
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
# Xutils展示图片
// 展示图片
// BitmapUtils bitmapUtils = new BitmapUtils(mContext);// 每次new对象时,都会创建内存空间,new多个会导致内存溢出,需要实现单例(BitmapUtilsHelp)
// 设置图片缩放类型
imageView.setScaleType(ScaleType.CENTER_CROP);
bitmapUtils.display(imageView, topnewsData.get(position).topimage);
# 轮播图中设置图片描述
在ViewPager的监听器中
public void onPageSelected(int position) {
// 当轮播图滑动时,根据滑动的位置更新图片描述
tv_tabdetail_info.setText(topnewsData.get(position).title);
}
在parseJson方法中初始化第一个图片描述
// 初始化轮播图第一页的图片描述
tv_tabdetail_info.setText(topnewsData.get(0).title);
# 轮播图中设置红点指示器
在parseJson方法中初始化白点
for(int i= 0;i<topnewsData.size();i++){
ImageView imageView = new ImageView(mContext);
imageView.setBackgroundResource(R.drawable.tabdetail_point_selector);
LayoutParams params = new LayoutParams(5, 5);
imageView.setLayoutParams(params);
params.leftMargin = 10;
imageView.setEnabled(false);
// 把创建的点添加到容器中
ll_tabdetail_points.addView(imageView);
}
// 初始化轮播图中第一个红点
ll_tabdetail_points.getChildAt(0).setEnabled(true);
滑动ViewPager时,让红点根据位置变化
在ViewPager的监听器中
public void onPageSelected(int position) {
// 把前一个红点变白色
ll_tabdetail_points.getChildAt(preRedPointIndex).setEnabled(false);
// 当轮播图滑动时,根据滑动的位置更新图片描述
tv_tabdetail_info.setText(topnewsData.get(position).title);
// 当轮播图滑动时,把相应位置的点变红色
ll_tabdetail_points.getChildAt(position).setEnabled(true);
preRedPointIndex = position;
}
轮播图从北京滑到国际后,再回到北京时,红点不能随手指滑动把相应位置的点变红,因为北京这个TabDetailPager对象没有销毁,他的成员变量还是之前的值,需要再次显示北京时,把preRedPointIndex归为0
在parseJson方法中
// 当重新展示某一个页签详情界面时,重新把前一个红点位置归零
preRedPointIndex = 0;
# 更新新闻列表
// 更新新闻列表-----------------------------------
newsData = tabDetailBean.data.news;
lv_tabdetail_news.setAdapter(new NewsAdapter());
tabdetail_newsitem.xml中给图片设置边缘效果是通过background、src和padding共同完成
<ImageView
android:id="@+id/iv_newsitem_img"
android:layout_width="100dp"
android:layout_height="60dp"
android:background="#33000000"
android:padding="1dp"
android:scaleType="fitXY"
android:src="@drawable/item_default" />
相关文章推荐
- Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况
- 界面表格数据对齐一般原则
- 练习:团购界面搭建(xib 封装,刷新数据增加 cell)
- java-get数据提交时,编码方式的解决,适用与一般情况下,对于更好的解决方案,暂时还没有时间,写到...
- AdapterView在无数据情况下的界面显示
- 为什么Spring的HibernateTemplate一般情况下不支持数据的惰性加载的源码分析
- Vue.js搭建移动端购物车界面-基本结构和数据渲染
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
- 总结2015搭建日志,监控,ci,前端路由,数据平台,画的图与界面 - hugo - ITeye技术网站
- 安卓仿手机网易新闻app项目开发系列之(四)数据分离与填充界面 上
- Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况
- QT界面程序经过网路与普通的linux应用程序进行数据传送的情况
- 用MVC搭建班级站点----注册界面:数据注解的使用
- SharedPreference 存储小量数据,一般首次启动显示引导界面就用这个。
- [原创]在ASP.NET环境下完整的datagrid填充数据后界面动态显示填充方案
- 关于mysql-connector-net-6.3.4 MySqlDataAdapter 在空数据的情况下填充DataSet后tables[0] 找不到的问题
- 孙其功陪你学之--QT界面程序经过网路与普通的linux应用程序进行数据传送的情况(UDP协议,非TCP协议):
- LigerUI学习---界面搭建、数据请求、分页实现(持续跟新)
- 网络:登录界面搭建与数据保存
- 安卓仿手机网易新闻app项目开发系列之(四)数据分离与填充界面 下