Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!

Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!


感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲的是时间轴的实现,说实话,其实就是listview的偷梁换柱,本来我会在写listview这个系列的时候写的,但是最近自己写的一个项目《Only》上用到了,很多群友说也想看看怎么实现的,独乐乐不如众乐乐,所以就提前先来分享,说说listview,这可是一个名角,在android上很受欢迎,也很实用,当然本篇不会详细讲解listview,只是说怎么用listview实现时间轴的效果,无奈listview我也正在学习当中,而且新出的RecyclerView更是如艺术般的华丽,都要去学习,只能感叹”书山有路勤为径,学海无涯苦作舟”,我们,我们就不瞎BB了,直接进入正题吧

还是老话,无图无真相

实现

1.新建项目TimeLineDemo

2.下载GSON

我们做本地存储需要,当然,你也可以从其他渠道下载

初始版本 2008年5月22日
最新版本(稳定版本) 2.2.4/2013年5月13日;2个月前
编程语言 Java
操作平台 各种平台
许可协议 Apache License 2.0
官方网站 http://code.google.com/p/google-gson/
下载地址 http://code.google.com/p/google-gson/downloads/list
GSON帮助文档 :
http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html


3.Adapter

ListView需要一个adapter,我们就定义一个TimeLineAdapter
package com.lgl.timelinedemo;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class TimelineAdapter extends BaseAdapter {

    private Context context;
    private List<Map<String, Object>> list;
    private LayoutInflater inflater;

    public TimelineAdapter(Context context, List<Map<String, Object>> list) {
        super();
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {

        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.item, null);
            viewHolder = new ViewHolder();
            viewHolder.day = (TextView) convertView.findViewById(R.id.day);
            viewHolder.time = (TextView) convertView.findViewById(R.id.time);
            viewHolder.content = (TextView) convertView
                    .findViewById(R.id.content);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        String day = list.get(position).get("day").toString();
        String time = list.get(position).get("time").toString();
        String content = list.get(position).get("content").toString();

        if (day != "") {
            viewHolder.day.setBackgroundColor(Color.WHITE);
        }
        if (time == null) {
            time = "#";
        }
        if (content == null) {
            content = "#";
        }
        viewHolder.day.setText(day);
        viewHolder.day.setBackgroundResource(R.drawable.timeline_year);
        viewHolder.time.setText(time);

        viewHolder.day.setText(day);
        viewHolder.time.setText(time);
        viewHolder.content.setText(content);

        return convertView;
    }

    static class ViewHolder {
        public TextView day;
        public TextView time;
        public TextView content;
    }
}

4.item.xml

adapter需要一个item,也就是时间轴偷梁换柱的根本

<?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="match_parent"
    android:background="#ffffff"
    android:orientation="vertical"
    android:paddingRight="20dp" >

    <View
        android:id="@+id/view_1"
        android:layout_width="2dp"
        android:layout_height="15dp"
        android:layout_marginLeft="30dp"
        android:background="#E9F01D" />

    <TextView
        android:id="@+id/show_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/view_1"
        android:layout_marginLeft="30dp"
        android:text=""
        android:textSize="12dp" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:layout_below="@+id/view_1"
        android:layout_marginLeft="24dp"
        android:src="@drawable/timeline_red" />

    <View
        android:id="@+id/view_2"
        android:layout_width="2dp"
        android:layout_height="45dp"
        android:layout_below="@+id/image"
        android:layout_marginLeft="30dp"
        android:background="#E9F01D" />

    <RelativeLayout
        android:id="@+id/relative"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/image"
        android:layout_marginLeft="5dp"
        android:layout_marginTop="-20dp"
        android:layout_toRightOf="@+id/image"
        android:background="@drawable/timeline_content_blue"
        android:padding="5dp" >

        <TextView
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:text="03:22"
            android:textSize="14sp" />

        <TextView
            android:id="@+id/content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="3dp"
            android:layout_toRightOf="@id/time"
            android:text="内容,写点啥好尼?
            android:textSize="14sp" />
    </RelativeLayout>

    <TextView
        android:textColor="#fff"
        android:layout_marginLeft="15dp"
        android:id="@+id/day"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/view_2"
        android:layout_marginTop="-2dp"
        android:gravity="center"
        android:text="01月13日"
        android:textSize="8sp" />

    <View
        android:id="@+id/view_5"
        android:layout_width="2dp"
        android:layout_height="10dp"
        android:layout_alignLeft="@+id/view_2"
        android:layout_below="@+id/day"
        android:background="#E9F01D" />

</RelativeLayout>

5.activity_main.xml

然后我们就可以来写主布局,为了方便,我就直接添加一个EditText和一个Button做添加处理了
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="add"
        android:id="@+id/add"
        />

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

6.MainActivity

好了,最后一步,我们就来编写这个ListView了
package com.lgl.timelinedemo;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class MainActivity extends Activity {

    // 声明一个listview
    private ListView listView;
    // listview的adapter
    private TimelineAdapter timelineAdapter;
    // 数据集
    private List<Map<String, Object>> list;
    private EditText et;
    private Button add;
    // 键值对
    private Map<String, Object> map;

    private String cacheName = "cache";
    private Gson gson = new Gson();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取SharedPreferences
        SharedPreferences sp = getSharedPreferences("config",
                Context.MODE_PRIVATE);
        final SharedPreferences.Editor edit = sp.edit();

        // 标记
        String cache = sp.getString(cacheName, "");
        list = gson.fromJson(cache,
                new TypeToken<ArrayList<Map<String, Object>>>() {
                }.getType());
        if (list == null) {
            list = new ArrayList<Map<String, Object>>();
        }
        et = (EditText) findViewById(R.id.et);
        listView = (ListView) this.findViewById(R.id.listview);
        listView.setDividerHeight(0);
        timelineAdapter = new TimelineAdapter(this, list);
        listView.setAdapter(timelineAdapter);

        add = (Button) findViewById(R.id.add);
        add.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                map = new HashMap<String, Object>();
                // 月-日
                SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日");
                // 时-分
                SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
                map.put("day", sdf.format(new Date()));
                map.put("time", sdf1.format(new Date()));
                map.put("content", et.getText().toString());

                list.add(map);
                // 倒序
                Collections.reverse(list);
                // 通知刷新
                timelineAdapter.notifyDataSetChanged();
                // 提交
                edit.putString(cacheName, gson.toJson(list));
                edit.commit();
            }
        });
    }
}

因为用了GSON,所以我们做了本地存储,软件关闭后并不会清除数据,本地化保存,当然,如果有朋友想说怎么删除,只要removeitem就可以了,不过,这属于listview的操作,都是后话了,如果发现有错误,请指点,万分感谢,如果觉得好,来个关注点个赞,嘻嘻!

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9406896

时间: 2024-12-21 11:18:26

Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!的相关文章

Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究了一套逻辑,这是一整套的2048游戏从设计到逻辑再到编写的全部过程,小伙伴们看仔细咯,刚好今天是礼拜天,一天应该了一把这篇博客发表了,其实2048开发起来还是有点难度的,并且他的逻辑挺强的,我也是看了很多的资料偷学的,很适合来锻炼自己的逻辑性 我们首先先来选择开发环境,这里我们就以Eclipse为I

Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化

Android实训案例(五)--四大组件之一ContentProvider的使用,通讯录的实现 Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯 我们后续也会一一的为大家讲解,今天就使用内容提供者ContentProvider查询系统的数据库来获取联系人,我们用listview装载 我们新建一个项目就叫MyPhone吧 并且添加权限 <uses-permission android:name="android.permission.READ_CONTACTS

Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局

Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就学习了一下,写篇博客梳理一下自己的思路,加深一下印象 视频链接:http://www.imooc.com/learn/641 一.棋盘 我们一看就知道,我们必须自定义View,这里我们定义一个GameView来做游戏主类,第一步,先测量,我们这里不难知道,五子棋他的棋盘是一个正方形,所以我们需要去测

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他所有的原理搞懂,但是最起码的,我要把他的各种使用方法了如指掌才行 BroadcastReceiver 接收系统的广播,比如电话,短信之类的 1.IP拨号器 我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,

Android实训案例(一)——计算器的运算逻辑

Android实训案例(一)--计算器的运算逻辑 应一个朋友的邀请,叫我写一个计算器,开始觉得,就一个计算器嘛,很简单的,但是写着写着发现自己写出来的逻辑真不严谨,于是搜索了一下,看到mk(没有打广告-.)上有视频,于是看了下他的逻辑,以前还真是小瞧计算器了,计算器要是高级一点的处理起来更加繁琐,这里就做了一个简单一点的,这次用的是Android Studio 开发的,毕竟自己也是一直很推崇AS,但是在之前的博客里都只是为了方便,一直在用Eclipse 一直强烈推荐大家还是转移到AS上去,虽然我

Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要,思路一定要清晰,我们做一个简单的项目,所以也就设计的比较简陋了,首先新建一个项目--AnswerSystem 一.实现项目框架 主页面就是一个问题,四个答案,还有一个正确答案,最后就是翻页了,正确答案默认是隐藏的,所以我们的layout_mian.xml是这样实现的 <?xml version=&qu

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

Service Service的神奇之处,在于他不需要界面,一切的操作都在后台操作,所以很多全局性(手机助手,语音助手)之类的应用很长需要这个,我们今天也来玩玩 我们新建一个工程--ServiceDemo 1.启动服务 服务是怎么启动的,我们先定义一个按钮吧 <Button android:id="@+id/startservice" android:layout_width="wrap_content" android:layout_height="

瞄准职教市场,天地超云发布实训室一体机

   现如今,我们已经进入到了一个数据爆炸的时代,信息存储量级与传输规模正以前所未见的速度增加,大型云计算数据中心正在成为信息高速公路上最重要的基础设施.云计算的发展与互联网的普及推动了IT资源运营和管理模式的变革,也对技术与产品的快速演进起到了强力的推进作用,在供给侧与消费端都催生了大量的用人需求. IDC数据表明,2012年有170万云计算相关职位空缺,2017年这一人才缺口将上升至800万.在人才供不应求的大背景下,有一个现象值得关注,即大部分求职者虽具备IT从业履历,但普遍缺乏云计算工作

图片-android相册shang 时间轴是怎么实现的啊?

问题描述 android相册shang 时间轴是怎么实现的啊? 我见现在很多android手机的系统相册滑动的时候,都会在左边时间轴上显示相应的时间等信息.或者在右侧的scrollbar上显示信息,这该怎么实现啊? 我用gridview实现了分组显示图片,可以按年月日,但是那是在每组头部显示.不知道怎么才能在时间轴上捕获这年月日信息...求大神指点迷津 解决方案 http://www.oschina.net/question/920274_166535 解决方案二: http://downloa