一项目简介和思路
上次已经实现了数据的抓取和解析,还有轮播视图效果。但是轮播图和itemview的显示数据是一样的,此次我们要做的就是把轮播图和itemview数据分离。大体的思路就是把比如一共提取7条数据,让前三条显示轮播图,后四条显示itemview,这样数据就不会一样了。好了,接下来具体怎么来实现。
二.项目流程
1.数据封装和分离
1)封装banner轮播图数据
public class BannerBean {
private String[] img_url;
private String[] title;
private String[] toUrl;
public String[] getImg_url() {
return img_url;
}
public void setImg_url(String[] img_url) {
this.img_url = img_url;
}
public String[] getTitle() {
return title;
}
public void setTitle(String[] title) {
this.title = title;
}
public String[] getTourl() {
return toUrl;
}
public void setTourl(String[] tourl) {
this.toUrl = tourl;
}
public BannerBean() {
}
}
这里把title、imgurl、tourl及get,set方法封装起来起来,方便后面的banner方法调用。
2)更新数据,分配数据
private List<Data> item_list; //item视图数据集合
private int mPosition; //记录当前页位置
private BannerBean mBannerBean; //存储轮播图数据对象
private int now_num=7; // 记录当前存放数据条数
// 回调的更新方法
public void upData(List<Data> [] msg_list) {
this.msg_list = msg_list;
initData();
adapter.notifyDataSetChanged();
}
//更新数据,分配数据,填充界面
public void initData(){
if(msg_list!=null){
String[] img=new String[3];
String[] title=new String[3];
String[] toUrl=new String[3];
item_list.clear();//清空缓存
List<Data> data=msg_list[mPosition];
for (int i=0;i<3;i++){
img[i]=data.get(i).getThumbnail();
title[i]=data.get(i).getTitle();
toUrl[i]=data.get(i).getUrl();
}
mBannerBean.setTitle(title);
mBannerBean.setImg_url(img);
mBannerBean.setTourl(toUrl);
for(int i=3;i<now_num;i++){
item_list.add(data.get(i));
}
adapter.notifyDataSetChanged();
}
}
原来的回调更新方法是直接在该方法里写了数据更新,而这里因为我们要实现banner和item数据的分离,为了简化代码,就把它们单独写成intdata()函数里。这部分代码主要是完成更新数据,重写分配数据,把前三条数据分配给banner,数据存放在mBannerBeand对象里。把后四条分配给itemview,存放在item_list里面,然后再进行更新。
3)数据初始化
private void getData() {
//轮播视图和item数据集合初始化
item_list=new ArrayList<>(); //add
mBannerBean=new BannerBean(); //add
// 注册本类去监听数据加载变化
jsonUtils =new JsonUtils(FirstpageFragment.this);//this表示 firstfragment的对象;当前类要监听数据更新的所在类;
//加载数据
jsonUtils.getResult();
}
这一步还是挺重要的,如果不初始化会导致报空指针,图片不会显示的问题。
在firstpageadapter.java文件里更新形参
public FirstPageAdapter(Context context, List<Data> item_data, BannerBean bean){
this.mcontext=context;
this.item_data=item_data;
this.bean=bean;
}
在相应的firstpagefragment.java里也要对应上 adapter=new FirstPageAdapter(getActivity(),item_list,mBannerBean);
这里的item_list和mbannerbean就是我们上面的2)里更新后等到的数据,然后把他们传入适配器构造方法里,用来后续适配器与视图绑定,在视图上显示我们的数据。
5)数据和视图绑定
//把数据绑定到viewholder
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//判断holder是不是BannerViewHolder
if (holder instanceof BannerViewHolder) {
BannerViewHolder bannerViewHolder = (BannerViewHolder) holder; // 把指向子类对象的父类引用holder赋给子类的引用 bannerViewHolder,
//属于向下转换,需要强制转换类型
//add---------------
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.simpleView.setImageURI(item_data.get(position-1).getThumbnail());//add
itemViewHolder.textView.setText(item_data.get(position-1).getTitle());// add
此部分代码主要是实现数据和视图绑定,标add的部分就是改动的地方setbannerstyle(),setbannertitle(),setimages()分别是设置banner的轮播样式,标题和图片资源的方法。这里样式设置的是带有圆形指示器,标题和图片都是来自于我们的网上获取的数据。item部分就是获取一张图片和相应的标题。这里的position-1是因为banner已经占了首位置。
写到这里,我们先运行下简单看下效果:
可以看到,轮播图指示器,标题和item视图的效果都有了。今天内容先讲到这,下次接着讲下拉刷新和上拉加载