两种实现的效果一样(左边嵌套,右边数据平铺)

代码链接https://download.csdn.net/download/hxinfiniti/11141747

实现时间轴的两种方式:

1、嵌套RecyclerView,需要在Adapter布局中再实现一个RecyclerView

2、把解析的数据再进行封装之后实现数据的平铺,只要一个RecyclerView即可实现效果,根据不同的数据类型设置不同的布局实现数据的展示

这两种实现的效果一样,但是第二种数据平铺的实现性能要更好,毕竟第二种是嵌套了RecyclerView,每个item都要创建RecyclerView布局,只是第一种不用对数据再进行封装;数据封装也比较简单,相比之下,第二种实现方式更好

后台json数据格式:

 "code":0,"data":[{"dataList":[{"title":"资讯标题1","id":1550481263035,"releaseDate":"2019-03-18"}],"dateString":"2019-03-18"}]

第一种实现方式:嵌套方式实现

实体类:这是获取的json格式数据

public class TimeLineData {private String dataString;private List<DataList> dataList;public String getDataString() {return dataString;}public void setDataString(String dataString) {this.dataString = dataString;}public List<DataList> getDataList() {return dataList;}public void setDataList(List<DataList> dataList) {this.dataList = dataList;}static class DataList{private String title;private String id;private String releaseDate;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getReleaseDate() {return releaseDate;}public void setReleaseDate(String releaseDate) {this.releaseDate = releaseDate;}@Overridepublic String toString() {return "DataList{" +"title='" + title + '\'' +", id='" + id + '\'' +", releaseDate='" + releaseDate + '\'' +'}';}}@Overridepublic String toString() {return "TimeLineData{" +"dataString='" + dataString + '\'' +", dataList=" + dataList +'}';}
}

适配器

public class TimeLineAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{private NewsDetailListener newsDetailListener;public void setNewsDetailListener(NewsDetailListener newsDetailListener) {this.newsDetailListener = newsDetailListener;}private List<TimeLineData> timeLineDataList;private Context context;public void setTimeLineDataList(List<TimeLineData> timeLineDataList) {this.timeLineDataList = timeLineDataList;}public TimeLineAdapter(Context context){this.context=context;}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new  TimeLineViewHolder(LayoutInflater.from(context).inflate(R.layout.item_time_line,parent,false));}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if (!timeLineDataList.isEmpty()){TimeLineData timeLineData=timeLineDataList.get(position);if (holder instanceof TimeLineViewHolder){((TimeLineViewHolder) holder).mTime.setText(timeLineData.getDataString());((TimeLineViewHolder) holder).mNewsNumber.setText(String.valueOf(timeLineData.getDataList().size()));RecyclerView newsRecyclerView=((TimeLineViewHolder) holder).mNewsList;LinearLayoutManager manager=new LinearLayoutManager(context);manager.setOrientation(LinearLayoutManager.VERTICAL);newsRecyclerView.setLayoutManager(manager);NewsAdapter newsAdapter=new NewsAdapter(timeLineData.getDataList());newsRecyclerView.setAdapter(newsAdapter);}}}@Overridepublic int getItemCount() {return timeLineDataList!=null?timeLineDataList.size():0;}class TimeLineViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.time)TextView mTime;@BindView(R.id.news_number)TextView mNewsNumber;@BindView(R.id.news_list)RecyclerView mNewsList;TimeLineViewHolder(View itemView) {super(itemView);ButterKnife.bind(this,itemView);}}// 嵌套的适配器class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsItemViewHolder>{List<TimeLineData.DataList>  dataLists;NewsAdapter(List<TimeLineData.DataList> dataLists){this.dataLists=dataLists;}@NonNull@Overridepublic NewsItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new NewsItemViewHolder(LayoutInflater.from(context).inflate(R.layout.item_news_title,parent,false));}@Overridepublic void onBindViewHolder(@NonNull NewsItemViewHolder holder, int position) {if (!dataLists.isEmpty()){TimeLineData.DataList data=dataLists.get(position);holder.mNewsTitle.setText(data.getTitle());}}@Overridepublic int getItemCount() {return dataLists!=null?dataLists.size():0;}class NewsItemViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.news_title)TextView mNewsTitle;NewsItemViewHolder(View itemView) {super(itemView);ButterKnife.bind(this,itemView);}@OnClick(R.id.news_detail)public void OnClick(){if (newsDetailListener!=null){newsDetailListener.detailClick(dataLists.get(getAdapterPosition()));}}}}/*** 点击事件回调*/public interface NewsDetailListener{void detailClick(TimeLineData.DataList data);}}

activity实现代码

public class TimeLineActivity extends AppCompatActivity  {@BindView(R.id.time_line)RecyclerView recyclerView;private TimeLineAdapter timeLineAdapter;private TimeLineAdapter1 timeLineAdapter1;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_time_line);ButterKnife.bind(this);initView();initData();/*  initView1();initData1();*/}private void initView(){LinearLayoutManager manager=new LinearLayoutManager(this);manager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(manager);timeLineAdapter = new TimeLineAdapter(this);recyclerView.setAdapter(timeLineAdapter);// 点击事件监听timeLineAdapter.setNewsDetailListener(data -> {Toast.makeText(this, data.toString(), Toast.LENGTH_SHORT).show();});}/*** 模拟数据*/private void initData(){List<TimeLineData> timeLineData=new ArrayList<>();TimeLineData timeLineData1=new TimeLineData();timeLineData1.setDataString("2019-04-24");List<TimeLineData.DataList> dataLists1=new ArrayList<>();TimeLineData.DataList data1=new TimeLineData.DataList();data1.setId("111111111111111");data1.setTitle("资讯标题1");data1.setReleaseDate("2019-04-24");TimeLineData.DataList data2=new TimeLineData.DataList();data2.setId("22222222222");data2.setTitle("资讯标题2");data2.setReleaseDate("2019-04-24");dataLists1.add(data1);dataLists1.add(data2);timeLineData1.setDataList(dataLists1);timeLineData.add(timeLineData1);TimeLineData timeLineData2=new TimeLineData();timeLineData2.setDataString("2019-04-25");List<TimeLineData.DataList> dataLists2=new ArrayList<>();TimeLineData.DataList data3=new TimeLineData.DataList();data3.setId("33333333");data3.setTitle("资讯标题3");data3.setReleaseDate("2019-04-24");TimeLineData.DataList data4=new TimeLineData.DataList();data4.setId("444444444");data4.setTitle("资讯标题4");data4.setReleaseDate("2019-04-24");TimeLineData.DataList data5=new TimeLineData.DataList();data5.setId("55555555");data5.setTitle("资讯标题5");data5.setReleaseDate("2019-04-24");dataLists2.add(data3);dataLists2.add(data4);dataLists2.add(data5);timeLineData2.setDataList(dataLists2);timeLineData.add(timeLineData2);TimeLineData timeLineData3=new TimeLineData();timeLineData3.setDataString("2019-04-26");List<TimeLineData.DataList> dataLists3=new ArrayList<>();TimeLineData.DataList data6=new TimeLineData.DataList();data6.setId("33333333");data6.setTitle("资讯标题6");data6.setReleaseDate("2019-04-24");TimeLineData.DataList data7=new TimeLineData.DataList();data7.setId("444444444");data7.setTitle("资讯标题7");data7.setReleaseDate("2019-04-24");TimeLineData.DataList data8=new TimeLineData.DataList();data8.setId("55555555");data8.setTitle("资讯标题8");data8.setReleaseDate("2019-04-24");dataLists3.add(data6);dataLists3.add(data7);dataLists3.add(data8);timeLineData3.setDataList(dataLists3);timeLineData.add(timeLineData3);timeLineAdapter.setTimeLineDataList(timeLineData);timeLineAdapter.notifyDataSetChanged();}}

第二种实现,需要把后台解析的数据实现再次封装

实体类:需要对解析的数据进行封装成TimeLineData1

public class TimeLineData1 {private String title;private String id;private String releaseDate;private String dateString; // 时间,也就是时间轴private int type; // 类型,根据不同的类型是时间还是资讯标题private int count; // 数量public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getReleaseDate() {return releaseDate;}public void setReleaseDate(String releaseDate) {this.releaseDate = releaseDate;}public int getType() {return type;}public void setType(int type) {this.type = type;}public String getDateString() {return dateString;}public void setDateString(String dateString) {this.dateString = dateString;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}@Overridepublic String toString() {return "TimeLineData1{" +"title='" + title + '\'' +", id='" + id + '\'' +", releaseDate='" + releaseDate + '\'' +", dateString='" + dateString + '\'' +", type=" + type +'}';}
}

适配器

public class TimeLineAdapter1 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {enum ItemType{TIME, //时间NEWS // 标题}private Context context;private List<TimeLineData1> timeLineData1List;private OnDetailNewsListener onDetailNewsListener;public void setTimeLineData1List(List<TimeLineData1> timeLineData1List) {this.timeLineData1List = timeLineData1List;}public void setOnDetailNewsListener(OnDetailNewsListener onDetailNewsListener) {this.onDetailNewsListener = onDetailNewsListener;}public TimeLineAdapter1(Context context) {this.context = context;}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {if (viewType==ItemType.TIME.ordinal()){return new TimeLineViewHolder(LayoutInflater.from(context).inflate(R.layout.item_time_line1,parent,false));}else if (viewType==ItemType.NEWS.ordinal()){return new NewsViewHolder(LayoutInflater.from(context).inflate(R.layout.item_news_title,parent,false));}return null;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if (!timeLineData1List.isEmpty()){TimeLineData1 timeLineData1=timeLineData1List.get(position);if (holder instanceof TimeLineViewHolder){((TimeLineViewHolder) holder).mTime.setText(timeLineData1.getDateString());((TimeLineViewHolder) holder).mNewsNumber.setText(String.valueOf(timeLineData1.getCount()));}else if (holder instanceof NewsViewHolder){((NewsViewHolder) holder).mNewsTitle.setText(timeLineData1.getTitle());}}}@Overridepublic int getItemCount() {return timeLineData1List!=null?timeLineData1List.size():0;}@Overridepublic int getItemViewType(int position) {if (!timeLineData1List.isEmpty()){// 根据不同的类型来设置不同布局return timeLineData1List.get(position).getType()==0?ItemType.TIME.ordinal():ItemType.NEWS.ordinal();}return super.getItemViewType(position);}class TimeLineViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.time)TextView mTime;@BindView(R.id.news_number)TextView mNewsNumber;TimeLineViewHolder(View itemView) {super(itemView);ButterKnife.bind(this,itemView);}}class NewsViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.news_title)TextView mNewsTitle;NewsViewHolder(View itemView) {super(itemView);ButterKnife.bind(this,itemView);}@OnClick(R.id.news_detail)public void onClick(){if (onDetailNewsListener!=null){onDetailNewsListener.onDetailNews(timeLineData1List.get(getAdapterPosition()));}}}public interface OnDetailNewsListener{void onDetailNews(TimeLineData1 data1);}}

activity中的实现

public class TimeLineActivity extends AppCompatActivity  {@BindView(R.id.time_line)RecyclerView recyclerView;private TimeLineAdapter timeLineAdapter;private TimeLineAdapter1 timeLineAdapter1;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_time_line);ButterKnife.bind(this);/*  initView();initData();*/initView1();initData1();}private void initView1(){LinearLayoutManager manager=new LinearLayoutManager(this);manager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(manager);timeLineAdapter1=new TimeLineAdapter1(this);recyclerView.setAdapter(timeLineAdapter1);timeLineAdapter1.setOnDetailNewsListener(data1 -> {Toast.makeText(this, data1.toString(), Toast.LENGTH_SHORT).show();});}/*** 这里直接模拟数据,需要自己实现数据的封装*/private void initData1(){List<TimeLineData1> lineData1s=new ArrayList<>();TimeLineData1 timeLineData1=new TimeLineData1();timeLineData1.setDateString("2019.04.24");timeLineData1.setType(0);timeLineData1.setCount(2);TimeLineData1 timeLineData12=new TimeLineData1();timeLineData12.setId("11111111");timeLineData12.setReleaseDate("2019.04.24");timeLineData12.setTitle("资讯标题1");timeLineData12.setDateString("2019.04.24");timeLineData12.setType(1);TimeLineData1 timeLineData13=new TimeLineData1();timeLineData13.setId("2222222222");timeLineData13.setReleaseDate("2019.04.24");timeLineData13.setTitle("资讯标题2");timeLineData13.setDateString("2019.04.24");timeLineData13.setType(1);TimeLineData1 timeLineData14=new TimeLineData1();timeLineData14.setDateString("2019.04.25");timeLineData14.setType(0);timeLineData14.setCount(1);TimeLineData1 timeLineData15=new TimeLineData1();timeLineData15.setId("33333333");timeLineData15.setReleaseDate("2019.04.25");timeLineData15.setTitle("资讯标题3");timeLineData15.setDateString("2019.04.25");timeLineData15.setType(1);TimeLineData1 timeLineData16=new TimeLineData1();timeLineData16.setDateString("2019.04.26");timeLineData16.setType(0);timeLineData16.setCount(1);TimeLineData1 timeLineData17=new TimeLineData1();timeLineData17.setId("444444444");timeLineData17.setReleaseDate("2019.04.26");timeLineData17.setTitle("资讯标题4");timeLineData17.setDateString("2019.04.26");timeLineData17.setType(1);lineData1s.add(timeLineData1);lineData1s.add(timeLineData12);lineData1s.add(timeLineData13);lineData1s.add(timeLineData14);lineData1s.add(timeLineData15);lineData1s.add(timeLineData16);lineData1s.add(timeLineData17);timeLineAdapter1.setTimeLineData1List(lineData1s);timeLineAdapter1.notifyDataSetChanged();}}

Android两种时间轴实现相关推荐

  1. android列表时间轴,Android实现列表时间轴

    本文实例为大家分享了Android列表时间轴展示的具体代码,供大家参考,具体内容如下 实现的效果图如下: 实现的方式是利用recycleview的ItemDecoration这个抽象类,就是我们经常用 ...

  2. android系统提供了url通信,Android两种HTTP通信,HttpURLConnection和HttpClient

    Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURL ...

  3. Android超简单时间轴的实现

    这里先说一下,我就试了一下CSDN的富文本编辑器,结果我退出去以后保存了草稿,发到自己的博客去了,而且我没有删除选项-无视吧,唉! 时间轴 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户 ...

  4. 两种时间选择器的三种使用场景(带效果图)

    前言,顺便看一下效果图 在Android 开发中时间选择器的使用场景还是很多的,我这边也是常用的有两种方法,根据不同是使用需求和场景来使用,大家如果在开发中有这种需求的可以看一下本篇 一.DatePi ...

  5. (转载)Android两种Tab分页的方式:TabActivity和ActivityGroup以及Android项目几种常见的应用架构...

    在Android里面Tab分页,常用的方法有两种: 一.TabActivity和TabHost的结合 1.主类继承TabActivity public class Tagpage extends Ta ...

  6. 第二节:比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)

    一. 时间的类型 1. 背景 这里为什么要介绍时间类型呢,明明是定时调度篇,原因是在定时任务中,任务什么时间开始执行,什么时间结束执行,要用到各种各样的时间模式,虽然这不能算是一个复杂的问题,但在正式 ...

  7. android自定义横向时间轴,Android自定义时间轴的实现过程

    本文讲述Android自定义时间轴的实现过程,供大家参考,具体内容如下 时间轴效果,实际上非常简单,就是listView中一个又一个的条目而已-.大家可以只关注一个条目. 首先展示一个条目的布局效果 ...

  8. android两种广播注册区别,Android 注册广播的两种方式对比

    Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...

  9. android 两种设置全屏的activity方式

    第一种是在我们的代码中进行设置,如下两行代码即可: 不过这两段代码一定要在setContentView(R.layout.main)之前进行声明的,一定要注意这一段,否则可能不会成功.闲话不多说,如下 ...

最新文章

  1. 关于Java里面File类创建txt文件重复???
  2. jenkins 打包 命令
  3. jdk1.8hashmap为什么对hash进行了一次扰动处理
  4. Spring-boot IDEA使用注解@ConfigurationProperties时报错解决
  5. echarts柱状图,改变柱状颜色
  6. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区
  7. mysql索引红黑联盟_MySQL的索引
  8. DirectX诊断工具怎么打开?怎么查看当前电脑所支持的DirectX版本?
  9. 计算机创建快捷方式w10,win10中解决无法在桌面添加快捷方式的修复方法
  10. 封装pc端获取经纬度 百度地图
  11. Word文档 公式换行 小技巧
  12. python怎么换背景颜色_更换python默认编辑器背景色的操作方法
  13. 超级符号就是超级创意_超级食物
  14. 【计算机网络】常见面试题总结
  15. 计算机专业答辩开场白,毕业论文答辩开场白
  16. emlog模板 Meta主题带后台开源版 资源娱乐网模板
  17. EasyClick iOS脚本免越狱免硬件实现方案_可云控大量部署
  18. PCI Express学习篇---Power Management(二)
  19. SAP业务顾问必备的技术能力
  20. root = Tk() 和 root = Tkinter.Tk() 区别

热门文章

  1. okio篇3-超时机制
  2. 做个全栈工程师真的好吗?
  3. 【流媒体协议】RTMP和RTSP的区别
  4. ceph (cephadm)集群部署
  5. 论文翻译——中国武汉市2019年新型冠状病毒感染患者的临床特征
  6. 抵抗不了“刷礼物”的诱惑,下架的斗鱼要上市有点难
  7. 安装纯净版win系统
  8. 基于HMM的语音合成理论知识
  9. Appium TestNg Maven Android Eclipse java简单启动实例
  10. 如何在线压缩PDF文件大小?