安卓 广告位

需求:类似网易新闻客户端,listview头部要显示广告位,广告位数量动态从后台获取,并且不一定一直有广告位

 

 

问题:listview下拉刷新与广告位touch事件的冲突解决,广告位的左滑右滑事件与整个fragment的左右切换事件冲突解决,广告位的数量动态获取,作为listview的header显示解决

 

实际做的过程中碰到的问题:


1、广告位的控件是继承自PagerAdapter,许多应用的广告位的显示是基于首先知道广告的数量的,这样在new adapter的时候,就可以分配多少数量,这样在adapter就可以直接加载显示图片。但是我们的应用是直接从后台拉取图片数量,所以我在new adapter之前是不知道图片的数量的。我尝试吧这个拉取广告的异步任务放在刚进主页的时候进行,进广告这页的时候直接加载。但是会出现这样的问题,如果没网的话,主页是拉取不到广告的,这样在进广告主页的时候,会出现listview的头部是空白的情况,然后我在listview进行addheaderView()的时候,进行了一下判断,如果拉取的广告位空的话,就不加载头部。这样虽然头部空白的问题解决了,但是当用户此时再次切换到有网的状态是,进行下拉刷新,应该是执行拉取广告的异步任务的,重新刷出来广告位。结果我发现,拉取到了广告,但是header没有被add进去呀,你不能在异步任务执行完,在add一遍,因为add必须放在listview在set Adapter之前完成。所以怎么办呢?

1.1进行的判断不应该限制listview添加header,而是隐藏header,并且隐藏的还不能是头部的根布局,必须是你显示广告图片的那个控件,可以参考这个http://blog.csdn.net/ethan_xue/article/details/9852209

1.2 可是我事先不知道广告的数量呐,这种情况可以再拉取广告图片的异步任务的post函数中,拿到广告的图片数量以后,再让广告设置一遍adapter就可以了,以下四行代码

     adsAdapter = new AdvAdapter(HomeFrag.recommendAdsList.size());
     mPager.setAdapter(adsAdapter);

    adsAdapter.notifyDataSetChanged();
    findmoreAdapter.notifyDataSetChanged();

这样原来被隐藏的广告位下拉刷新执行完异步之后,广告位就又出来了。

1.3 adsAdapter.notifyDataSetChanged();这句话的执行,如果不修改一下pageradapter是不行的,参考这个http://blog.csdn.net/gzsword/article/details/7284288

所以需要再adsadapter的里面添加几行代码:

 @Override  public int getItemPosition(Object object) {  return POSITION_NONE;  }  

综上,附上完整的代码:

/** 添加HeadView(广告控件) **/private void addHeadView(LayoutInflater inflater) {mHeadView = (View) inflater.inflate(R.layout.fragment_head_view, null);mPager = (MyViewPager) mHeadView.findViewById(R.id.fragment_view_pager);//显示广告图片的           viewpager
        adsAdapter = new AdvAdapter(HomeFrag.recommendAdsList.size());//这个list是刚进主页的拉取广告数量的数组,不是持久的数据
        mPager.setAdapter(adsAdapter);mPager.setOnSimpleClickListener(new AdsImageViewOnClickLostener());mPager.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub
                mPager.getGestureDetector().onTouchEvent(event);// TODO Auto-generated method stubfinal float x = event.getRawX();final float y = event.getRawY();switch (event.getAction()) {  case MotionEvent.ACTION_DOWN:  xDistance = yDistance = 0f;mLastMotionX = x;mLastMotionY = y;case MotionEvent.ACTION_MOVE:  final float xDiff = Math.abs(x - mLastMotionX);final float yDiff = Math.abs(y - mLastMotionY);xDistance += xDiff;yDistance += yDiff;float dx = xDistance - yDistance;/** 左右滑动避免和下拉刷新冲突   **/if (xDistance > yDistance || Math.abs(xDistance - yDistance) < 0.00001f) {mIsBeingDragged = true;mLastMotionX =  x;mLastMotionY = y;((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(true);} else {mIsBeingDragged = false;((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);}break;  case MotionEvent.ACTION_UP:  break;  case MotionEvent.ACTION_CANCEL:if(mIsBeingDragged) {((ViewParent) v.getParent()).requestDisallowInterceptTouchEvent(false);}break;default:  break;  }  return false;  }});if(HomeFrag.recommendAdsList.size()!=0){myListView.setTag(mPager);myListView.addHeaderView(mHeadView,null,false);adsAdapter.notifyDataSetChanged();}else{//暂时先隐藏headview,广告从无到有刷新出来再可见
            myListView.setTag(mPager);myListView.addHeaderView(mHeadView,null,false);mPager.setVisibility(View.GONE);adsAdapter.notifyDataSetChanged();}}
    /** 广告控件适配器  **/public class AdvAdapter extends PagerAdapter{private List<View> mList ;public AdvAdapter(int size) {// TODO Auto-generated constructor stubmList = new ArrayList<View>();for(int i = 0; i<size;i++){View item = LayoutInflater.from(context).inflate(R.layout.ads_item ,null);mList.add(item);}}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mList.size();}// 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可  
        @Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0 == arg1;  }// PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁
        @Overridepublic void destroyItem(ViewGroup container, int position, Object object) {// TODO Auto-generated method stub
            ((ViewPager) container).removeView(mList.get(position));//mPager.removeViewCache(position);  
        }@Override    public void finishUpdate(View arg0) {}    @Override  public void restoreState(android.os.Parcelable state, ClassLoader loader) {  };  @Override    public Parcelable saveState() {    return null;    }    @Override    public void startUpdate(View arg0) {}    // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化,我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可  
        @Overridepublic Object instantiateItem(ViewGroup container,  int position) {// TODO Auto-generated method stubView view = mList.get(position);ImageView image = ((ImageView) view.findViewById(R.id.image));TextView text_view = (TextView) view.findViewById(R.id.ads_tv);Bitmap bitmap = null;if(HomeFrag.recommendAdsList.size()!=0){bitmap = BitmapFactory.decodeFile(HomeFrag.recommendAdsList.get(position).picPath);image.setImageBitmap(bitmap);if(HomeFrag.recommendAdsList.get(position).adsTitle!=null&&HomeFrag.recommendAdsList.get(position).adsTitle.equals("")){text_view.setVisibility(View.INVISIBLE);}else{text_view.setVisibility(View.VISIBLE);text_view.setText(HomeFrag.recommendAdsList.get(position).adsTitle);}}container.removeView(mList.get(position));container.addView(mList.get(position));// adapter.notifyDataSetChanged();return mList.get(position);}@Override  public int getItemPosition(Object object) {//加上这个,adsAdapter.notifyDataSetChanged()才可以刷新return POSITION_NONE;  }  }public class AdsImageViewOnClickLostener implements onSimpleClickListener{//点击广告栏的监听
       @Overridepublic void setOnSimpleClickListenr(int position) {// TODO Auto-generated method stubif(HomeFrag.recommendAdsList.get(position).adsType.equals("1")){//跳转到签到界面,加载网页//GPUtils.toast(context, recommendAdsList.get(position).adsType);Intent intent  = new Intent();intent.putExtra("source", "ads");intent.putExtra("ads_url", HomeFrag.recommendAdsList.get(position).adsUrl);intent.setClass(getActivity(),SigninActivity.class);getActivity().startActivity(intent);}else {Intent intent = new Intent(context,MyFavouriteDetailsActivity.class);Bundle bundle = new Bundle();bundle.putInt("position", position);bundle.putString("label", HomeFrag.recommendAdsList.get(position).articleType);if(HomeFrag.recommendAdsList.get(position).adsType.equals("2")){//官方发布的文章bundle.putString("source", "AdsArticleHjz");}else if(HomeFrag.recommendAdsList.get(position).adsType.equals("3")){//用户发布的文章bundle.putString("source", "AdsArticleUser");} intent.putExtras(bundle);startActivity(intent);}}}
//添加广告位的异步任务的部分代码
    @Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);if (result != null) {if (result.equals("success")) {HomeFrag.recommendAdsList.clear();for (int i = 0; i < recommendAdsListTemp.size(); i++) {HomeFrag.recommendAdsList.add(recommendAdsListTemp.get(i));}if(HomeFrag.recommendAdsList.size()!=0){mPager.setVisibility(View.VISIBLE);}adsAdapter = new AdvAdapter(HomeFrag.recommendAdsList.size());//重新设置一下适配器,更新广告位
                    mPager.setAdapter(adsAdapter);//addHeadView(LayoutInflater.from(context));//这个是执行不了的
                    adsAdapter.notifyDataSetChanged();findmoreAdapter.notifyDataSetChanged();}}}

 

转载于:https://www.cnblogs.com/lucky-star-star/p/4610321.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis oracle trace,ArcGIS应用Oracle Spatial特征分析

该文章并不是将Oracle Spatial与ST_Geometry做对比&#xff0c;关于两者的对比&#xff0c;可以参考&#xff1a;http://www.linuxidc.com/Linux/2011-10/45492.htm&#xff0c;这里从数据结构&#xff0c;到性能对比&#xff0c;都描述的很清楚。其实这篇文件就是说明一下在A…

SharePoint Timer Job

首先介绍一下什么是定时器作业&#xff0c;说的再多&#xff0c;也不如一张图说的清楚这两张图应该把我想说的已经表达清楚了&#xff0c;下一步介绍一下如何自定义Timer Job第一步&#xff1a;创建一个类&#xff08;CustomTimerJob.cs&#xff09;第二步&#xff1a;引用 usi…

python获取div标签的id_Python 获取div标签中的文字实例

预备知识点compile 函数compile 函数用于编译正则表达式&#xff0c;生成一个正则表达式( Pattern )对象&#xff0c;供 match() 和 search() 这两个函数使用。语法格式为&#xff1a;re.compile(pattern[, flags]).compile(pattern[, flags])参数&#xff1a;pattern : 一个字…

生活是长跑

人生不是百米冲刺&#xff0c;是长跑&#xff0c;需要日积月累&#xff0c;建立自己的人生观&#xff0c;生活态度&#xff0c;从各个方面去不断的积累自己&#xff0c;最后才能获取成功的人生。 生活是一个系统工程&#xff0c;每一方面都要经营维护&#xff0c;不要因为某种…

这次使用一个最舒服的姿势插入HttpClient拦截器技能点

码甲哥继续在同程艺龙写一点大前端&#xff0c;今天我们来了解一下如何拦截axios请求/响应&#xff1f;这次我们举一反三&#xff0c;用一个最舒适的姿势插入这个技能点。本文阅读耗时5 minute&#xff0c;行文耗时5 Days。axios是一个基于 promise 的网络请求库&#xff0c;可…

甜蜜助攻!情侣之间,到底能有多甜甜甜甜甜甜甜甜

▲ 点击查看没有一丝丝防备&#xff0c;还有 5 天&#xff0c;七夕就要到了。如何借「物」聊表爱意&#xff0c;大概是最近让很多拥有另一半的人头疼不已的问题。重点是&#xff0c;礼物挑不好&#xff0c;小心七夕就变送命题&#xff01;女孩子们到底喜欢什么礼物&#xff1f;…

套接口和I/O通信

几个I/O相关的函数&#xff1a; #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd); 为了实现通信&#xff0c;fd可以是套接口&#xff08;见linux的套接口和管道&#xff…

oracle bcp out,SQL Server利用bcp命令把SQL语句结果生成文本文件

这篇文章主要为大家详细介绍了SQL Server利用bcp命令把SQL语句结果生成文本文件&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小编两巴掌来看看吧&#xff01;在SQL Server里可以调用DOS下的命令行工具bcp来实…

多个查询语句能否一次把结果导出_mysql表中base64格式数据查询

需求&#xff1a;为了避开特殊字符(如&#xff1a;单引号)影响&#xff0c;把某些字段保存为base64格式。SQL语句直接解码base64编码数据&#xff0c;直接查询出原始数据。表中数据如下很不直观&#xff0c;当根据where条件查询时&#xff0c;肉眼不能直接从结果提取到可读信息…

【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表

第一次弄RDL报表. 权当自己的一个随手笔记吧.希望能有好的意见或者建议欢迎大家提出来. 一起学习.灰常欢迎.. 第一步,先找出你的Reporting Server 的 URL . 如图&#xff1a; 其中URL 就是ReportingServer 的URL 在新建的aspx页面部署的时候非常重要. 虚拟目录的话,在WIN 7 上…

志愿者招募 | 2021 .NET Conf China

回顾往届 .NET Conf China 活动志愿者团队承担着非常重要的职责参与到活动组织和安排过程的方方面面志愿者的团队协作和专业素养展示出了高度的凝聚力和号召力无私付出和敬业得到了多方的好评今年&#xff0c;我们诚邀更多志愿者加入与助力为 2021年中国 .NET 开发者大会提供志…

数学上最有趣的数,装得了逼,撩得了妹!

全世界只有3.14 % 的人关注了爆炸吧知识一分钟记住走马灯数那些美丽有趣的自然数一定有它存在的意义&#xff0c;就像帅气逼人的超模君依然具有令人羡慕的才华。但是&#xff0c;存在这么一些自然数&#xff0c;例如走马灯数一直被视为无用&#xff0c;一身正气的超模君决定找到…

php运算符优先级题目,详解php运算符优先级

php中&#xff0c;一个运算可能是有多个运算符连接在一起的&#xff0c;我们给其运算的执行决定先后顺序&#xff0c;下面由小编给大家介绍php运算符优先级&#xff0c;希望对需要的朋友有所帮助&#xff01;在php运算中遵循的规则就是&#xff1a;优先级高的运算符优先执行&am…

阿里开发规范文档_华为阿里等技术专家15年开发经验总结:SSM整合开发实战文档...

前言Spring自2002年诞生至今&#xff0c;已有近20年的历史&#xff0c;虽然几经变迁&#xff0c;但始终在继续发展和精进。Spring目前由Pivotal维护和开发。Pivotal是PaaS&#xff08;平台即服务&#xff09;的领导者&#xff0c;也是消息中间件RabbitMQ的缔造者。12306的流量销…

两天低效编程总结

这两天在用appcan做手机应用&#xff0c;非常纠结。就原因做一下总结和备忘&#xff1a; 1.产品设计足够了&#xff0c;技术设计还不够。中途换了一次框架&#xff0c;没有考虑到换框架的兼容性。 2.过于依赖调试工具&#xff0c;设计和写代码时的大局观不够。 3.时间管理做得不…

Swift中的区间运算符和半开区间运算符

2019独角兽企业重金招聘Python工程师标准>>> 区间&#xff0c;使用三个点表示&#xff08;a...b&#xff09;&#xff0c;表示从a到b&#xff0c;包含a和b&#xff0c;b要大于a&#xff0c;包含第一个和最后一个 半开区间&#xff0c;&#xff08;a..<b&#xf…

软件项目开发过程中主要遇到的核心问题小结

最近在北京组织管理某银行的现金管理系统项目的开发&#xff0c;对软件项目开发过程中遇到的问题进行一些心得体会小结&#xff0c;怕时间长了没及时写下来时间久了被遗忘了&#xff0c;现在趁项目还在开发过程&#xff0c;把体会相对深刻时&#xff0c;感受到的一些问题整理下…

使用 Directory.Build 来消除项目文件中的重复配置

使用 Directory.Build 来消除项目文件中的重复配置Intro如果解决方案里的项目比较多的话&#xff0c;往往会有很多重复的项目属性&#xff0c;通常我们可以使用独立的 props 属性文件来配置公用的属性&#xff0c;而一般的属性文件都需要手动的 Import 到项目文件中&#xff0c…

mysql 批量更新和批量插入

1. 批量更新 update table_name set field_name CASE id WHEN id1 THEN field_value, WHEN id1 THEN field_value END 2.批量插入 insert into table_name (field1_name, field2_name) values(field1_value, field2_name) , (field1_value, field2_name)

chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验

今年首个Windows 10正式版更新于近日上架MSDN&#xff0c;版本号最终确定为Build 19041.208(v2004)&#xff0c;这是一个RTM版本&#xff0c;也就是送到OEM厂商压盘的正式版本&#xff0c;向用户正式推送的时候不会再有什么功能变化。按照微软的一贯逻辑&#xff0c;上半年更新…