RecyclerView版的时光轴

因为现在RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item。

它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局。

使用它的理由:

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.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 08:01:56

RecyclerView版的时光轴的相关文章

ExpandableListView版的时光轴

上两篇讲到了用listView和recyclerView来实现时光轴,这一篇我们用ExpandableListView来实现时光轴,废话不多说,直接来代码. 还是先activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" an

时光轴二之RecyclerView版时光轴效果

因为现在RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item. 它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局. 使用它的理由: RecyclerView is a more advanced and flexible version of Li

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/

RecyclerView 的 RecyclerView.Adapter 通用版的实现

RecyclerView 的 RecyclerView.Adapter 通用版的实现(有加载更多的功能) Android5.0给我们带来了RecyclerView 他的灵活性非常强,可以替代Listview和GridView,本文主要说说他的适配器的使用,下面是自己封装的一个通用版的适配器(),废话不多说,看代码: //这个Adapter里面有两个抽象方法 public abstract class MyRecycleViewAdapter<T> extends RecyclerView.Ad

RecyclerView&amp;自定义View实现时光轴效果

在QQ空间,淘宝,京东,以及一些旅游类的app上经常可以看到时间轴的效果,这种时间轴的效果有多种实现方式,本文用RecyclerView和自定义View来实现这个效果. 实现的效果图如下: 分析 从上面的效果图可以看出,这个就是一个RecyclerView,并且他的LayoutManager为LinearLayoutManager,LinearLayoutManager的方向是垂直的.但是我们注意到他的item不是都是一致的,大概有这几种情况: 只有一个item 第一个item 普通item 最

Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)

Android可伸缩布局-FlexboxLayout(支持RecyclerView集成) 1 . 前言 前几天看到Google官方的博客介绍了Google开源的一个强大的布局-FlexboxLayout,看见第一眼我心里的想法是,卧槽,Android 居然有这么一个强大的布局.作为一个有好奇心的工程狮,当然第一时间就去试了试手,效果非常赞,因此这篇文章就介绍一下它的用法和最新版添加的一些特性(支持集成RecyclerView),Github地址:https://github.com/google

TwinklingRefreshLayout 小而强大的刷新控件,自带顺滑的越界回弹,v1.04 版精心重构,完美发布啦!

TwinklingRefreshLayout v1.04 版精心重构,优化 UI.刷新及越界动画效果,修复众多 bug,完美发布! TwinklingRefreshLayout延伸了Google的SwipeRefreshLayout的思想,不在列表控件上动刀,而是使用一个ViewGroup来包含列表控件,以保持其较低的耦合性和较高的通用性.其主要特性有: 支持RecyclerView.ScrollView.AbsListView系列(ListView.GridView).WebView以及其它可

RecyclerView学习笔记

自学习android以来,其实一直都有接触到 RecyclerView,今天便总结一下关于RecyclerView的相关知识,并不是非常全面.主要从以下几个方面: RecyclerView概述 RecyclerView与ListView区别 RecyclerView基本使用 RecyclerView item单击与长按事件 RecyclerView item长按拖拽和侧滑删除 源码地址:https://github.com/Ti2Yuan/RecyclerViewDemo 1. Recycler

Android Material Design之在RecyclerView中嵌套CardView实现

前言: 第一眼就爱上了Android的Material Design风格.以前倒对Android的界面风格不那么喜欢,扁平化的界面设计真是好看. 其实,这个嵌套操作在实现上并没有什么难点.可是,我还在Eclipse上没有试验成功.后来换到Android Studio上就OK了.以下是实现过程. 笔者开发环境: 系统:Windows 7 旗舰版 IDE:Android Studio v1.0 工具包:cardview-v7-21.0.0.aar recyclerview-v7-21.0.0.aar