您的位置:首页 > 其它

一般情况的界面搭建和数据的填充

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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐