您的位置:首页 > 其它

完整项目实战备忘录的实现之知识点总结

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/

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: