时光轴二之RecyclerView版时光轴效果
它不但变得更精简,也变得更加easy使用,并且更easy组合设计出自己须要的滑动布局。
使用它的理由:
RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically.官方介绍 RecyclerView 是 ListView,grideView以及瀑布流的实现 的升级版本号,更加先进和灵活。
所以我把上一篇
listView实现时光轴效果改为RecyclerView 来实现,你觉得是不是更加好呢。反正官方都推荐我们使用RecyclerView,这个控件我们再也不须要操心渲染的影响了。
按部就班我们先来布局,
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/timeline_recyclerview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</RelativeLayout>
然后item的布局和上一篇的一模一样:(直接copy)
item_time_line.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<RelativeLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:background="@drawable/img_line_point" />
<TextView
android:id="@+id/txt_date_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="15dp"
android:textColor="#FC6802" />
</RelativeLayout>
<View
android:id="@+id/v_line"
android:layout_width="2dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:background="#FC6802" />
<ImageView
android:padding="8dp"
android:id="@+id/img"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_below="@id/rl_title"
android:layout_marginLeft="3dp"
android:layout_toRightOf="@id/v_line"
android:scaleType="fitXY" />
<TextView
android:paddingTop="15dp"
android:id="@+id/txt_date_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/rl_title"
android:layout_marginLeft="15dp"
android:layout_toRightOf="@id/img"
android:paddingBottom="10dp"
android:maxLines="3"
android:textColor="#5296C5" />
</RelativeLayout>
好了能够写代码了:
先来一下数据实体:
DateText.java(copy)
package com.zy.timeline.bean;
public class DateText {
private String date;
private String text;
private int imgsrc;
public DateText(String date, String text,int imgsrc) {
super();
this.date = date;
this.text = text;
this.imgsrc=imgsrc;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public int getImgsrc() {
return imgsrc;
}
public void setImgsrc(int imgsrc) {
this.imgsrc = imgsrc;
}
}
接着数据适配器:
TimeLineAdapter .java
package com.zy.timeline.adapter;
import java.util.List;
import com.zy.timeline.R;
import com.zy.timeline.bean.DateText;
import com.zy.timeline.bean.TimeFormat;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView; public class TimeLineAdapter extends
RecyclerView.Adapter<TimeLineAdapter.TimeLineViewHolder> {//这里千万记住TimeLineViewHolder,不然会出错
private Context context;
private LayoutInflater mInflater;
private List<DateText> mDatas;
public TimeLineAdapter(Context context, List<DateText> mDatas) {
this.context = context;
this.mDatas = mDatas;
mInflater = LayoutInflater.from(context);
}
@Override
public int getItemCount() {
return mDatas == null ? 0 : mDatas.size();
}
// 绑定viewHolder
@Override
public TimeLineViewHolder onCreateViewHolder(ViewGroup parent, int viewtype) {
return new TimeLineViewHolder(mInflater.inflate(
R.layout.item_time_line, parent, false));
}
@Override
public void onBindViewHolder(TimeLineViewHolder holder, int position) {
// 时间轴竖线的layout
LayoutParams params = (LayoutParams) holder.line.getLayoutParams();
// 第一条数据,肯定显示时间标题
if (position == 0) {
holder.title.setVisibility(View.VISIBLE);
holder.date_time.setText(TimeFormat.format("yyyy.MM.dd", mDatas
.get(position).getDate()));
params.addRule(RelativeLayout.ALIGN_TOP, R.id.rl_title);
params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.img);
} else { // 不是第一条数据
// 本条数据和上一条数据的时间戳相同,时间标题不显示
if (mDatas.get(position).getDate()
.equals(mDatas.get(position - 1).getDate())) {
holder.title.setVisibility(View.GONE);
params.addRule(RelativeLayout.ALIGN_TOP, R.id.txt_date_content);
params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.img);
} else {
// 本条数据和上一条的数据的时间戳不同的时候。显示数据
holder.title.setVisibility(View.VISIBLE);
holder.date_time.setText(TimeFormat.format("yyyy.MM.dd", mDatas
.get(position).getDate()));
params.addRule(RelativeLayout.ALIGN_TOP, R.id.rl_title);
params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.img);
}
}
holder.line.setLayoutParams(params);
holder.date_content.setText(mDatas.get(position).getText());
holder.img.setImageResource(mDatas.get(position).getImgsrc());
}
final class TimeLineViewHolder extends ViewHolder {
private TextView date_time, date_content;
private View line;
private RelativeLayout title;
private ImageView img;
public TimeLineViewHolder(View view) {
super(view);
date_time = (TextView) view.findViewById(R.id.txt_date_time);
date_content = (TextView) view.findViewById(R.id.txt_date_content);
line = (View) view.findViewById(R.id.v_line);
title = (RelativeLayout) view.findViewById(R.id.rl_title);
img = (ImageView) view
.findViewById(R.id.img);
}
}
}
接下来就是写mainActivity的代码了;
package com.zy.timeline;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.zy.timeline.adapter.TimeLineAdapter;
import com.zy.timeline.bean.DateComparator;
import com.zy.timeline.bean.DateText;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutManager; public class MainActivity extends Activity {
private RecyclerView recyclerView;
private List<DateText>mDatas;
private TimeLineAdapter mTimeLineAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
mDatas=new ArrayList<DateText>();
DateText date1 = new DateText("20140710", "人生的平衡。内涵也非常多。 丰富的内涵,是生存的保障。是身心的健康,是自由和快乐生活的均衡全面的发展。真理往往在俗人觉得的相反之处。常人好争,“圣人不敢为也”。随和谦让。常人追求美好的东西、好吃的东西吃过多了。以后就再也不能吃了。 真理讲的是心。不能离心找身外的原因。 ",R.drawable.one);
DateText date2 = new DateText("20120209", "夺走你初吻的人如今和你是什么关系",R.drawable.two);
DateText date3 = new DateText("20140526", "无论有多么的舍不得。我们都仅仅有笑过之后,长歌当哭。",R.drawable.three);
DateText date4 = new DateText("20150310", "那些让我们哭过的事,总有一天我们会笑着说出来。 ",R.drawable.one);
DateText date5 = new DateText("20140911", "你年轻时也曾扬言。要饮遍全世界的酒。 老了却发现,白水才是最长情的。",R.drawable.one);
DateText date6 = new DateText("20140713", "我这一个不太宽厚的肩膀仅仅希望你累了能停靠不太温暖却能为你挡住风浪",R.drawable.one);
DateText date7 = new DateText("20141012", "有人问过井上。“为什么不设计湘北最后夺冠?”-井上回答说“由于青春的梦想往往是不完美的…",R.drawable.one);
DateText date8 = new DateText("20140714", "将来的你,一定会感激如今拼命的自己。 ",R.drawable.one);
DateText date9 = new DateText("20140709", "地球之所以是圆的,是由于上帝想让那些走失或迷路的人又一次相遇",R.drawable.one);
DateText date10 = new DateText("20110705", "假设有一天我出事了,我一个电话能到场的有谁?",R.drawable.two);
DateText date11 = new DateText("20120729", "你厌恶自己的生活,然而有人在梦想着过你的生活。",R.drawable.two);
DateText date12 = new DateText("20130725", "非常爱非常爱你,可你却MD不知道",R.drawable.two);
DateText date13 = new DateText("20140716", "就算如今的他对你再好,都比只是以前那个伤你最深的人也是如今最熟悉的陌生人,",R.drawable.two);
DateText date14 = new DateText("20140711", "回顾中,总有些瞬间,能温暖整个以前。 ",R.drawable.two);
DateText date15 = new DateText("20140710", "我最想旅游的地方。是暗恋者的心。 ",R.drawable.two);
DateText date16 = new DateText("20140711", "我不是有益 让自己变得不像自己",R.drawable.two);
DateText date17 = new DateText("20100712", "不要求,不一定是没有心声。 不流泪,不一定是没有泪痕。不表达,不一定是不爱你",R.drawable.two);
DateText date18 = new DateText("20140711", "谁苍白了谁的等待,谁无悔着谁的执着。",R.drawable.two);
DateText date19 = new DateText("20140715", "网上作者呕心呖血码出的字。他们不费一兵一卒就能轻易地据为己有",R.drawable.three);
DateText date20 = new DateText("20120723", "自从我遇见你那天開始。我的心就像跌进了深深的湖水",R.drawable.three);
DateText date21 = new DateText("20150718", "有些东西。当你拥有时。你觉得理所应当。 当你失去时,才知道自己没资格。 ",R.drawable.three);
DateText date22 = new DateText("20130706", "有时候上天没有给你想要的,不是由于你不配。而是你值得拥有更好的。",R.drawable.three);
DateText date23 = new DateText("20110714", "退出没结局的剧",R.drawable.three);
DateText date24 = new DateText("20120726", "以前的现实,如今已是回顾。 ",R.drawable.three);
DateText date25 = new DateText("20140325", "谁人曾照应过我的感受,待我温和吻过伤口。谁人曾介意我也不好受。为我出头碰过我的手",R.drawable.three);
DateText date26 = new DateText("20140623", "人生归于尘埃如花瓣零落,然而人生生不息。花瓣飘零尘泥,依旧花开花落。",R.drawable.three);
DateText date27 = new DateText("20140121", "如今,我们都应忘了对方,又一次去过彼此的生活。",R.drawable.three);
DateText date28 = new DateText("20140916", "爱上大声地啊地",R.drawable.three);
DateText date29 = new DateText("20140712", "被人须要是种无法言表却又充满能量的安全感",R.drawable.one);
DateText date30 = new DateText("20140710", "没有信的日子。如同一堆温柴,被回顾点着,一脑子的浓烟。 ",R.drawable.two);
mDatas.add(date1);
mDatas.add(date2);
mDatas.add(date3);
mDatas.add(date4);
mDatas.add(date5);
mDatas.add(date6);
mDatas.add(date7);
mDatas.add(date8);
mDatas.add(date9);
mDatas.add(date10);
mDatas.add(date11);
mDatas.add(date12);
mDatas.add(date13);
mDatas.add(date14);
mDatas.add(date15);
mDatas.add(date16);
mDatas.add(date17);
mDatas.add(date18);
mDatas.add(date19);
mDatas.add(date20);
mDatas.add(date21);
mDatas.add(date22);
mDatas.add(date23);
mDatas.add(date24);
mDatas.add(date25);
mDatas.add(date26);
mDatas.add(date27);
mDatas.add(date28);
mDatas.add(date29);
mDatas.add(date30);
initView(); }
private void initView() {
recyclerView=(RecyclerView) findViewById(R.id.timeline_recyclerview);
init(); }
private void init() {
// 将数据依照时间排序
DateComparator comparator = new DateComparator();
Collections.sort(mDatas, comparator);
mTimeLineAdapter=new TimeLineAdapter(this, mDatas);
LayoutManager mLayoutManager=new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,true);//垂直的,listView的布局方式
recyclerView.setAdapter(mTimeLineAdapter);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());//默认动画
recyclerView.setHasFixedSize(true);//效率最高
}
}
其它的和上一篇用到的东西一样,也就不贴代码了,接下来还是看一下效果,是不是和listView一样,。看图:
算了我们的代码就写到这里了。6点多了也是下班的时间了,明天下一篇我们将实现用Expandablelistview来实现复杂一点的时光轴.
代码传送门:RecyclerView _linetime.zip,要下班了。马蛋。
自己能够把2个代码对比一下,就能分分钟知道listView改为recyclerView
.觉得还行就点个赞吧,请持续关注下一篇 时光轴三之
ExpandableListView版时光轴效果。
时光轴二之RecyclerView版时光轴效果的更多相关文章
- 时光轴三之 ExpandableListView版时光轴效果
上两篇讲到了用listView和recyclerView来实现时光轴,这一篇我们用ExpandableListView来实现时光轴,废话不多说,直接来代码. 还是先activity_main.xml ...
- 时光轴一之listView实现时光轴效果
尼玛.非要搞什么时光轴,一想简单的不就是个listView吗,然后一步一步来就好了,哈哈别看那么好看事实上不要想多了. 时光轴timeline最大的作用就是把过去的事物系统化.完整化.精确化.时间轴可 ...
- 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果
[转] 原文 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果 字数1598 阅读302 评论2 喜欢23 1.背景 RecyclerView ...
- RecyclerView实现ViewPager效果
RecyclerView实现ViewPager效果,以及横向的ListView效果.效果图如下: Github: https://github.com/hpu-spring87/recyclervie ...
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...
- Android之RecyclerView实现时光轴
做项目的过程中有个需求需要时光轴,于是网上找了部分资料 ,写了个案例,现在分享给大家. 如图: activity_main.xml <?xml version="1.0" e ...
- android标题栏上面弹出提示框(二) PopupWindow实现,带动画效果
需求:上次用TextView写了一个从标题栏下面弹出的提示框.android标题栏下面弹出提示框(一) TextView实现,带动画效果, 总在找事情做的产品经理又提出了奇葩的需求.之前在通知栏显示 ...
- RecyclerView实现ViewPager效果;
看代码就好了,RecyclerView实现Viewpager的效果,添加了界面的改变监听,用法和普通的RecyclerView一样,还可以设置一次滑动多个界面: public class VpRecy ...
- 【Android开发日记】之基础篇(二)——Android的动画效果
什么是动画,动画的本质是通过连续不断地显示若干图像来产生“动”起来的效果.比如说一个移动的动画,就是在一定的时间段内,以恰当的速率(起码要12帧/秒以上,才会让人产生动起来的错觉)每隔若干 ...
随机推荐
- [ Python - 13 ] 批量管理主机必备模块
批量管理程序必备模块 optparse configparser paramiko optparse模块 简介: optparse模块主要用来为脚本传递命令参数功能 使用步骤: 1. i ...
- python的算法:二分法查找(1)
1.什么是二分法查找: 1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: 2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从 ...
- python基础(字符串常用、数字类型转换、基本运算符与流程控制)
一.字符串常用操作: #! /usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "Z'N'Y" # Date: 2 ...
- Delphi Socket通信及多线程编程总结
http://cxhblog.blog.sohu.com/41930676.html 一.Socket通信: Delphi在ScktComp单元中对WinSock进行了封装,该单元提供了TAbstra ...
- 山东省第七届省赛 D题:Swiss-system tournament(归并排序)
Description A Swiss-system tournament is a tournament which uses a non-elimination format. The first ...
- Codeforces 626 B. Cards (8VC Venture Cup 2016-Elimination Round)
B. Cards time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- 【动态规划】矩形嵌套 (DGA上的动态规划)
[动态规划]矩形嵌套 时间限制: 1 Sec 内存限制: 128 MB提交: 23 解决: 9[提交][状态][讨论版] 题目描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a, ...
- 3、Django实战第3天:数据建模
users modesl.py设计 UserProfile 用户信息 EmailVerifyRecord 验证码 Banner 轮播图 之前我们生成了Django默认的数据表,里面有张表示auth-u ...
- [BZOJ5461][LOJ#2537[PKUWC2018]Minimax(概率DP+线段树合并)
还是没有弄清楚线段树合并的时间复杂度是怎么保证的,就当是$O(m\log n)$吧. 这题有一个显然的DP,dp[i][j]表示节点i的值为j的概率,转移时维护前缀后缀和,将4项加起来就好了. 这个感 ...
- Java 输入框复用代码
1 int messageType=JOptionPane.INFORMATION_MESSAGE; String message=mines + " minutes is approxim ...