配色: 字号:
Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!
2016-10-18 | 阅:  转:  |  分享 
  
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

操作平台各种平台

许可协议ApacheLicense2.0

3.Adapter



ListView需要一个adapter,我们就定义一个TimeLineAdapter

packagecom.lgl.timelinedemo;



importjava.util.List;

importjava.util.Map;



importandroid.content.Context;

importandroid.graphics.Color;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.widget.BaseAdapter;

importandroid.widget.TextView;



publicclassTimelineAdapterextendsBaseAdapter{



privateContextcontext;

privateList>list;

privateLayoutInflaterinflater;



publicTimelineAdapter(Contextcontext,List>list){

super();

this.context=context;

this.list=list;

}



@Override

publicintgetCount(){



returnlist.size();

}



@Override

publicObjectgetItem(intposition){

returnposition;

}



@Override

publiclonggetItemId(intposition){

returnposition;

}



@Override

publicViewgetView(intposition,ViewconvertView,ViewGroupparent){

ViewHolderviewHolder;

if(convertView==null){

inflater=LayoutInflater.from(context);

convertView=inflater.inflate(R.layout.item,null);

viewHolder=newViewHolder();

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();

}



Stringday=list.get(position).get("day").toString();

Stringtime=list.get(position).get("time").toString();

Stringcontent=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);



returnconvertView;

}



staticclassViewHolder{

publicTextViewday;

publicTextViewtime;

publicTextViewcontent;

}

}

4.item.xml



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






android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#ffffff"

android:orientation="vertical"

android:paddingRight="20dp">




android:id="@+id/view_1"

android:layout_width="2dp"

android:layout_height="15dp"

android:layout_marginLeft="30dp"

android:background="#E9F01D"/>




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"/>




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"/>




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"/>




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">




android:id="@+id/time"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:paddingLeft="5dp"

android:text="03:22"

android:textSize="14sp"/>




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"/>






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"/>




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"/>







5.activity_main.xml



然后我们就可以来写主布局,为了方便,我就直接添加一个EditText和一个Button做添加处理了




android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">




android:layout_width="match_parent"

android:layout_height="wrap_content"

android:id="@+id/et"

/>




android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="add"

android:id="@+id/add"

/>




android:id="@+id/listview"

android:layout_width="fill_parent"

android:layout_height="wrap_content"/>











6.MainActivity



好了,最后一步,我们就来编写这个ListView了

packagecom.lgl.timelinedemo;



importjava.text.SimpleDateFormat;

importjava.util.ArrayList;

importjava.util.Collections;

importjava.util.Date;

importjava.util.HashMap;

importjava.util.List;

importjava.util.Map;



importandroid.app.Activity;

importandroid.content.Context;

importandroid.content.SharedPreferences;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.View.OnClickListener;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.ListView;



importcom.google.gson.Gson;

importcom.google.gson.reflect.TypeToken;



publicclassMainActivityextendsActivity{



//声明一个listview

privateListViewlistView;

//listview的adapter

privateTimelineAdaptertimelineAdapter;

//数据集

privateList>list;

privateEditTextet;

privateButtonadd;

//键值对

privateMapmap;



privateStringcacheName="cache";

privateGsongson=newGson();



@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//获取SharedPreferences

SharedPreferencessp=getSharedPreferences("config",

Context.MODE_PRIVATE);

finalSharedPreferences.Editoredit=sp.edit();



//标记

Stringcache=sp.getString(cacheName,"");

list=gson.fromJson(cache,

newTypeToken>>(){

}.getType());

if(list==null){

list=newArrayList>();

}

et=(EditText)findViewById(R.id.et);

listView=(ListView)this.findViewById(R.id.listview);

listView.setDividerHeight(0);

timelineAdapter=newTimelineAdapter(this,list);

listView.setAdapter(timelineAdapter);



add=(Button)findViewById(R.id.add);

add.setOnClickListener(newOnClickListener(){



@Override

publicvoidonClick(Viewv){

map=newHashMap();

//月-日

SimpleDateFormatsdf=newSimpleDateFormat("MM月dd日");

//时-分

SimpleDateFormatsdf1=newSimpleDateFormat("HH:mm:ss");

map.put("day",sdf.format(newDate()));

map.put("time",sdf1.format(newDate()));

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的操作,都是后话了,如果发现有错误,请指点,万分感谢。

献花(0)
+1
(本文系网络学习天...首藏)