完整项目实战备忘录的实现之知识点总结
2016-01-06 21:35
477 查看
最近写了一个备忘录,
在这里把这个程序所用到的知识以及遇到的难点总结一下,
首先很多记事本,备忘录都有类似真实生活中的一行一行的实现,这个参照android sdk
Notepad里面写的,
int count = getLineCount();
// Gets the global Rect and Paint objects
Rect r = mRect;
Paint paint = mPaint;
for (int i = 0; i < count; i++) {
// Gets the baseline coordinates for the current line of text
int baseline = getLineBounds(i, r);
/*
* Draws a line in the background from the left of the rectangle to the right,
* at a vertical position one dip below the baseline, using the "paint" object
* for details.
*/
Log.d("gac", "baseLine:" + baseline);
canvas.drawLine(r.left, baseline + 10, r.right, baseline + 10, paint);
自定义EditText 在onDraw方法里 获取数据的总行数,遍历,通过getLineBounds方法,获得每一行文字的底部坐标,以及文字的左边右边的坐标,开始划线。但是这么做实现不了,一次出现多行的文本框,只能你输入一行,出现一行文本框。这个功能有待改进。
由于备忘录具有加密功能,加密一行的文本显示,和加密之前的文本显示是不同的布局,这就涉及到ListView item 多布局的实现。
主要解决方法就是 给你的布局设置类型,在你的数据源中ArrayList<myobject>.
在自定义Adapter里面重写@Override
public int getItemViewType(int position) {
return mDatas.get(position).lock;
}
@Override
public int getViewTypeCount() {
return 2;
}
这两个方法,
在getView 里根据你的布局类型填充,每一种布局设置一个ViewHolder.
LockViewHolder holder = null;
UnlockViewHolder unLockHolder= null;
Utils.log("getView position:"+position);
if(getItemViewType(position) == Utils.UNLOCK){
if(convertView == null){
unLockHolder = new UnlockViewHolder();
convertView = Utils.getView(mContext,R.layout.content_item);
unLockHolder.et_content =(TextView)convertView.findViewById(R.id.id_et_unlock);
convertView.setTag(unLockHolder);
}else{
unLockHolder = (UnlockViewHolder)convertView.getTag();
}
这里为你的ViewHolder 设置内容
}else{
if(convertView == null){
convertView = Utils.getView(mContext, R.layout.content_item_lock);
holder =new LockViewHolder();
//当前条目是edittext可用
convertView.setTag(holder);
}else{
holder = (LockViewHolder)convertView.getTag();
}
这里为你的ViewHolder设置内容
}
return convertView;
}
两种布局,在加上ViewHolder里需要点击处理事件,很容易出现布局复用,内容错乱的现象。
解决这个问题的核心思路就是,你的item布局里的控件会复用,但是adpater里的内容却不会出现复用。所以ViewHolder 里只可以有布局千万别涉及到listview item里内容相关的东西,例如 控件的状态信息 也不可以设置在ViewHolder里面。
由于我的item里有imageview 组成的菜单。所以涉及到ListView 里面的每一项都会出现一个菜单。就需要判断到底是哪个菜单触发了点击事件呢?
(你的第一条数据的菜单出现在了第十条,他点击的时候,一定是第十个item的位置的菜单,也是你第一条数据的菜单,你只要保证你的数据的position正确就ok了)
这里有种解决办法就是:给你的holder设置一个int 类型的position
每次getView调用的时候 都要重新设置你的position 标签。
这里拿菜单删除一条内容来举例:
case R.id.id_iv_delete:
mDatas.get(holder.position).openflag = false;
new DbOp(mContext).delete(mDatas.get(holder.position));
mDatas.remove(holder.position);
listener.update(mDatas.size());
notifyDataSetChanged();
initMenu(holder);//由于view的复用所以需要初始化菜单 否则 菜单处于打开状态
break;
你的数据源ArrayList 取得你holder.postion 位置的数据,就可以进行相应的操作。
你的item尽管复用,你只要保证你操作的数据是对应该条记录的数据,就不会出现错乱现象。
其他的知识点就是涉及到数据库的操作,以及activity之间的数据传递。都是一些逻辑的东西,就不总结了。
欢迎大家和我一起讨论:
项目源码地址:https://github.com/gacmy/beiwanglu/
在这里把这个程序所用到的知识以及遇到的难点总结一下,
首先很多记事本,备忘录都有类似真实生活中的一行一行的实现,这个参照android sdk
Notepad里面写的,
int count = getLineCount();
// Gets the global Rect and Paint objects
Rect r = mRect;
Paint paint = mPaint;
for (int i = 0; i < count; i++) {
// Gets the baseline coordinates for the current line of text
int baseline = getLineBounds(i, r);
/*
* Draws a line in the background from the left of the rectangle to the right,
* at a vertical position one dip below the baseline, using the "paint" object
* for details.
*/
Log.d("gac", "baseLine:" + baseline);
canvas.drawLine(r.left, baseline + 10, r.right, baseline + 10, paint);
自定义EditText 在onDraw方法里 获取数据的总行数,遍历,通过getLineBounds方法,获得每一行文字的底部坐标,以及文字的左边右边的坐标,开始划线。但是这么做实现不了,一次出现多行的文本框,只能你输入一行,出现一行文本框。这个功能有待改进。
由于备忘录具有加密功能,加密一行的文本显示,和加密之前的文本显示是不同的布局,这就涉及到ListView item 多布局的实现。
主要解决方法就是 给你的布局设置类型,在你的数据源中ArrayList<myobject>.
在自定义Adapter里面重写@Override
public int getItemViewType(int position) {
return mDatas.get(position).lock;
}
@Override
public int getViewTypeCount() {
return 2;
}
这两个方法,
在getView 里根据你的布局类型填充,每一种布局设置一个ViewHolder.
LockViewHolder holder = null;
UnlockViewHolder unLockHolder= null;
Utils.log("getView position:"+position);
if(getItemViewType(position) == Utils.UNLOCK){
if(convertView == null){
unLockHolder = new UnlockViewHolder();
convertView = Utils.getView(mContext,R.layout.content_item);
unLockHolder.et_content =(TextView)convertView.findViewById(R.id.id_et_unlock);
convertView.setTag(unLockHolder);
}else{
unLockHolder = (UnlockViewHolder)convertView.getTag();
}
这里为你的ViewHolder 设置内容
}else{
if(convertView == null){
convertView = Utils.getView(mContext, R.layout.content_item_lock);
holder =new LockViewHolder();
//当前条目是edittext可用
convertView.setTag(holder);
}else{
holder = (LockViewHolder)convertView.getTag();
}
这里为你的ViewHolder设置内容
}
return convertView;
}
两种布局,在加上ViewHolder里需要点击处理事件,很容易出现布局复用,内容错乱的现象。
解决这个问题的核心思路就是,你的item布局里的控件会复用,但是adpater里的内容却不会出现复用。所以ViewHolder 里只可以有布局千万别涉及到listview item里内容相关的东西,例如 控件的状态信息 也不可以设置在ViewHolder里面。
由于我的item里有imageview 组成的菜单。所以涉及到ListView 里面的每一项都会出现一个菜单。就需要判断到底是哪个菜单触发了点击事件呢?
(你的第一条数据的菜单出现在了第十条,他点击的时候,一定是第十个item的位置的菜单,也是你第一条数据的菜单,你只要保证你的数据的position正确就ok了)
这里有种解决办法就是:给你的holder设置一个int 类型的position
每次getView调用的时候 都要重新设置你的position 标签。
这里拿菜单删除一条内容来举例:
case R.id.id_iv_delete:
mDatas.get(holder.position).openflag = false;
new DbOp(mContext).delete(mDatas.get(holder.position));
mDatas.remove(holder.position);
listener.update(mDatas.size());
notifyDataSetChanged();
initMenu(holder);//由于view的复用所以需要初始化菜单 否则 菜单处于打开状态
break;
你的数据源ArrayList 取得你holder.postion 位置的数据,就可以进行相应的操作。
你的item尽管复用,你只要保证你操作的数据是对应该条记录的数据,就不会出现错乱现象。
其他的知识点就是涉及到数据库的操作,以及activity之间的数据传递。都是一些逻辑的东西,就不总结了。
欢迎大家和我一起讨论:
项目源码地址:https://github.com/gacmy/beiwanglu/
相关文章推荐
- Scala基础
- matlab的log()函数默认是以e为底的
- Windows下多线程数据同步互斥的有关知识
- 16.shell脚本编程(1)
- Windows下多线程数据同步互斥的有关知识
- OpenMesh学习笔记3 半边数据结构
- 剑指offer-从尾到头打印链表
- 秒杀多线程第十篇 生产者消费者问题
- 周易六十四卦——屯卦
- nandflah 简介
- VB URL的编解码源码 GB2312 UTF-8编解码
- Java基础学习5_数组
- Java基础学习4_流程控制语句
- Java基础学习3_常用运算符
- Java基础学习1_Java基础
- Java基础学习2_变量与常量
- C++ 输入与输出的学习
- ios crash的原因与抓取crash日志的方法
- 计算系数
- 字符串