安卓仿手机网易新闻app项目开发系列之(二)轮播图显示和RecyclerView适配器编写
一.项目简介和思路
接着上周项目继续,上周主要实现了tablayout的标题栏界面和屏幕切换效果。这次咱们来实现给屏幕页面填充些网页图片数据。看看大致效果图:
可以看出界面有两部分构成,上面是轮播图,下面是类似listview的列表控件,在这里分别采用的是banner和recycleview来实现效果,接下来是具体的流程
二.项目的流程
1.编写recycleview布局
新建一个fragment的xml文件,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"<android.support.v7.widget.RecyclerViewandroid:id="@+id/recycle_view"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>
2.编写recycleview适配器
1)设置数据填充
public class FirstPageAdapter extends RecyclerView.Adapter{ private final int TYPE_HEAD=0; //表示首个位置,显示轮播视图 private final int TYPE_NORMAL=1; //表示下面的itemview private final Context mcontext; private List<String> banner_url; //轮播图片路径 //这个构造函数的用于把要展示的数据传进来 public FirstPageAdapter(Context context, List<String> banner_url){ this.mcontext=context; this.banner_url=banner_url; }
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder holder=null; if(viewType==TYPE_HEAD){ //此处创建顶部banner的viewholder holder=new BannerViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.itemheader_banner,parent,false)); //把最外层布局加载然后传到构造函数BannerViewHolder(); 此句语句等同于:
// View view=LayoutInflater.from(mcontext).inflate(R.layout.itemheader_banner,parent,false);
// RecyclerView.ViewHolder holder=new BannerViewHolder(view) ; }else (viewType==TYPE_NORMAL) { holder=new ItemViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.item_firstfragment,parent,false)); } return holder; } public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { //判断holder是不是BannerViewHolder if (holder instanceof BannerViewHolder) { BannerViewHolder bannerViewHolder = (BannerViewHolder) holder; // 把指向子类对象的父类引用holder赋给子类的引用 bannerViewHolder, //属于向下转换,需要强制转换类型 bannerViewHolder.banner.setImages(banner_url);
// bannerViewHolder.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE);
// bannerViewHolder.banner.setBannerTitle(bean.getTitle());
// bannerViewHolder.banner.setImages( bean.getImg_url()); // Log.i("tag","--------------------------onbindview"); } else if (holder instanceof ItemViewHolder) { ItemViewHolder itemViewHolder = (ItemViewHolder) holder; itemViewHolder.textView.setText(banner_url.get(position - 1)); itemViewHolder.simpleView.setImageURI(banner_url.get(position - 1)); // } } //返回数据源长度 public int getItemCount() { return banner_url.size()+1;} //告诉创建什么类型viewholder public int getItemViewType(int position) { if(position==0){ return TYPE_HEAD; } else { return TYPE_NORMAL; } }
//初始化UIclass ItemViewHolder extends RecyclerView.ViewHolder{ SimpleDraweeView simpleView; TextView textView; public ItemViewHolder(View itemView) { super(itemView); simpleView= (SimpleDraweeView) itemView.findViewById(R.id.simpleView); textView= (TextView) itemView.findViewById(R.id.news_text); } } // 首位的banner class BannerViewHolder extends RecyclerView.ViewHolder{ Banner banner; public BannerViewHolder(View itemView) { super(itemView); banner= (Banner) itemView.findViewById(R.id.banner); //Log.i("tag","------------------66666"); } }
2)模拟数据源关联适配器
public class FirstpageFragment extends Fragment{private RecyclerView mRecyclerView;private FirstPageAdapter adapter;private List<String> banner_url;public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View v=getActivity().getLayoutInflater().inflate(R.layout.fragment_layout,(ViewGroup)getActivity().findViewById(R.id.view_pager),false);banner_url=new ArrayList<>();banner_url.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495535521175&di=abf42742f3808e2c9f3ad7889b60c5d3&imgtype=0&src=http%3A%2F%2Fimg.mp.itc.cn%2Fupload%2F20161108%2Fad0cb46844754d1b9844e5edd37e6990_th.jpeg");banner_url.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495535647123&di=1bfb6b6e626ac5deb329fdeb0fc5abab&imgtype=0&src=http%3A%2F%2Folpic.tgbusdata.cn%2Fuploads%2Fallimg%2F141106%2F22-141106112011.jpg");banner_url.add("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495535647123&di=1bfb6b6e626ac5deb329fdeb0fc5abab&imgtype=0&src=http%3A%2F%2Folpic.tgbusdata.cn%2Fuploads%2Fallimg%2F141106%2F22-141106112011.jpg");mRecyclerView= (RecyclerView) v.findViewById(R.id.recycle_view);adapter=new FirstPageAdapter(getActivity(),banner_url);mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));mRecyclerView.setAdapter(adapter);return v;}
这部分代码主要是模拟数据源,然后把数据和适配器绑定,最后通过适配器把数据在视图recycleview上显示出来。在这里需要注意的是关联适配器的时候多了一步,也比较关键,没设置的话可能会有问题,就是15//代码写的,这是recycview控件显示布局的设置,在这里我们设置的是一般的线性布局,默认是纵向布局。
3)轮播图和itemview的布局
轮播图banner
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><com.youth.banner.Bannerandroid:id="@+id/banner"android:layout_width="match_parent"android:layout_height="200dp"/>
</LinearLayout>
普通itemview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:orientation="horizontal"android:padding="5dp"android:layout_width="match_parent"android:layout_height="wrap_content"><com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/simpleView"android:layout_width="160dp"android:layout_height="100dp"fresco:placeholderImage="@mipmap/timg"/><TextViewandroid:id="@+id/news_text"android:layout_marginLeft="5dp"android:textSize="20sp"android:text="我爱鸿哥"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
要引用这两种控件需要添加依赖,一个是banner的,另一个是fresco,banner就是轮播图的控件,具体的使用可以点击此处链接看看 点击打开链接 ,在这里我用是compile 'com.youth.banner:banner:1.2.6' ; fresco是一个比较强大的图片加载的框架,可以支持各种格式的图片,它的 包是'com.facebook.fresco:fresco:1.3.0';
banner的布局文件比较简单,就简单给个id和宽高;而fresco布局是使用左边一张图片,右边对应文字。
4)添加网络访问
因为要上网访问图片,所以需要添加网络权限,在Androidmanifest.xml里添加:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.hongaer.molinews"><uses-permission android:name="android.permission.INTERNET" />
5)fresco初始化
在这里有个点大家得注意,可能会遇到item图片加载不出来的问题,就是在main.activity中需要fresco初始化,代码如下:
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); Fresco.initialize(this);initData();initView();}
这样大体代码写完了,看看运行后的效果图(这里也是和之前原因一样,所以先借用磨砺新闻的视频图):
安卓仿手机网易新闻app项目开发系列之(二)轮播图显示和RecyclerView适配器编写相关推荐
- 安卓仿手机网易新闻app项目开发系列之(一)项目简介和 界面搭建
前言: 最近自己在业余时间在网上学习""磨砺新闻""项目,花了3周左右跟着把项目做完了,所以趁着热度赶紧先mark下项目的过程,与大家分享下. 顺便给磨砺营打个 ...
- JQuery仿最新淘宝网首页带箭头幻灯片,JQuery轮播图
JQuery代码 <script type="text/javascript"> $(function() { var $banner = $('.banner'); ...
- 仿小米商城电脑官网-纯HTML+CSS(含轮播图)
来自作者的话 这是我第一次写博客,也是为了激励自己学习,分享一些前端学习的知识,有写的不好的多多包涵.下面是参考的一些博客的链接 https://blog.csdn.net/weixin_439768 ...
- 《移动应用开发》实验报告——轮播图
代码仓库:https://gitee.com/shentuzhigang/demo-project/tree/master/vue-photos Blog:https://shentuzhigang. ...
- 使用开源项目【Banner】实现轮播图效果(带小圆点)
banner开源项目地址:GitHub - youth5201314/banner:
- android开发banner框架,Android 轮播图 最火的banner框架 (包含demo和代码解释)
在android里,轮播图的实现可以使用viewpage的控件实现,但由于实现有点繁琐,可以使用banner框架,方便快捷的实现轮播图的效果.这里首先贴上github的banner框架地址:https ...
- vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)
在VS2015中创建Qt项目[VS+Qt项目开发系列](二) 发布时间:2018-04-20 22:44, 浏览次数:1269 , 标签: VS Qt 在上一篇[VS+Qt项目开发](一)在VS201 ...
- Swift项目,超美的动画和tableView,collectionView,轮播图的使用,网络请求的封装等
<一>项目介绍: 这是一个Swift语言的项目,但是其中也有使用一些OC的三方库,比SDWebImage.WebViewJavascriptBridge等,同时实现了基本App的框架功能, ...
- 微信小程序之网易云音乐(三)- 主页面底部导航、轮播图、歌单及歌曲模块开发
微信小程序之网易云音乐(三)- 主页面底部导航.轮播图.歌单及歌曲模块开发 前言 一. 主页面底部导航 二. 轮播图区域 三. 歌单区域 四. 歌曲区域 微信小程序之网易云音乐导航 前言 创建一个新模 ...
最新文章
- cobaltstrike安装_Cobalt Strike发送钓鱼邮件
- 《关系营销2.0——社交网络时代的营销之道》一从单向沟通转向多方沟通
- macappstore登不上去_荣耀亲选一度登机箱----一个安静得想放进大侄子的magic box
- 【转】Android OTA 升级之一:编译升级包
- window系统下如何查看so库的信息
- Spring配置形式之基于注解的方式
- 融合CDN,纾解数据拥塞之困
- php能干哪些副业,做副业,在能干的基础上踏实肯干
- 在c语言中逗号运算符若不带括号,详解shell脚本括号区别--$()、$「 」、$「 」 、$(()) 、「 」 、「[ 」]...
- ❤️Spring的静态、动态代理模式
- 柔性穿刺针有限元模型
- P1330 阳光封锁大学
- python运维脚本简书_Python运维篇:会Python的运维工程师价值多少?
- 读计算机专业买什么笔记本电脑好?你算问对人了
- 树莓派专用msata硬盘转接板
- seo入门需掌握的基础知识
- python预测子女身高_Python 孩子身高预测
- count()--不是单组分组函数
- 蓝桥杯 Python 练习题 数字游戏
- python爬虫爬取漫画(仅供学习)
热门文章
- python导入自定义模块报attributeerror_Python脚本报错AttributeError: ‘module’ src has no attribute’xxx’解决方法...
- 移动直播进入下半场盈利为王,突破打赏模式成关键
- 问题1:修改日志文件(redo log)的位置的方法
- 大学生能从计算机游戏中受益,2019年6月大学英语四级考试写作试题库:大学生...
- 阅读Android源代码
- Linux mkdir 命令使用介绍
- linux查看日志文件内容命令tail、cat、tac、head、echo
- SAP FI-CO应收应付重分类
- 生成10位由大小写字母和数字组成的随机激活码
- 2019年1月1日起,国家推出新的个人所得税政策,起征点上调值5000元。也就是说税前工资扣除五险一金(五险一金数额假设是税前工资的10%) * 后如果不足5000元,则不交税。