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

本文介绍了一种高效的数据缓存策略,确保应用快速响应用户体验。同时探讨了解决多种界面事件冲突的方法,如轮播图、ViewPager等组件的事件处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 新闻中心缓存数据


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" />








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值