29.自定义吐司的位置移动
吐司是不可以获取焦点的,为了能够让自定义的吐司能够移动,可以去掉吐司flags参数的FLAG_NOT_TOUCHABLE属性,并且将吐司的窗体类型由TYPE_TOAST换成TYPE_PRIORITY_PHONE,后者是android系统里面具有电话优先级的一种窗体类型。普通吐司不会影响用户操作手机的,而电话优先级的吐司会影响用户对手机的操作,所以需要添加权限:SYSTEM_ALERT_WINDOW。该权限在logcat中也不会提示。
更改吐司的位置:
首先给view对象设置一个触摸监听器,在监听器中处理手指移动的距离,更新吐司位置时要用到下面两个参数:
吐司的params有两个参数:params.x和params.y,当params.gravity=Gravity.TOP + Gravity.LEFT时,这两个参数分别是吐司距左边和上边的距离。
得到新位置后要更新吐司的位置用:
更新一个View对象的布局用:wm.updateViewLayout(textview,params);方法,第一个参数是要更新的View对象,第二个参数是params。
30.多次点击事件
long[] mHits = new long[2];//数组长度为几,就是处理几击事件
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
if(mHits[0] >= (SystemClock.uptimeMillis() - 500) ){处理多次点击事件}
其中,System.arraycopy(Object src, int srcPos,Object dst,int dstPos,int length)方法的5个参数分别是指:
src:拷贝的源数组
srcPos:从源数组的哪个位置开始拷贝
dst:目标数组
dstPos:从目标数组的哪个位置开始写数据
length:拷贝元素的个数。
SystemClock.uptimeMillis();:是获得手机开机到现在的时间。
31.利用holder优化ListView
首先创建一个static类型的holder内部类,声明控件,再在getView方法中获取控件ID时赋值给holder中声明的控件。这样就不必每次创建view对象时都创建新的控件。
<span style="font-size:18px;">/** * view对象的容器 * 记录孩子的内存地址 * 相当于一个记事本 * @author HP1 */ static class ViewHolder{ TextView tv_number; TextView tv_mode; } private class myAdapter extends BaseAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder; // 1.减少内存中view对象的创建次数 if (convertView != null) { view = convertView; holder = (ViewHolder) view.getTag(); } else { view = View.inflate(getApplicationContext(),R.layout.item_list_callsms, null); // 2.减少子孩子查询的次数 //内存中对象的地址 holder = new ViewHolder(); holder.tv_number = (TextView) view.findViewById(R.id.tv_item_number); holder.tv_mode = (TextView) view.findViewById(R.id.tv_item_mode); // 当孩子生出来的时候找到他们的引用,存放在记事本,放到父亲的口袋里 view.setTag(holder); } holder.tv_number.setText(infos.get(position).getNumber()); String mode = infos.get(position).getMode(); if ("1".equals(mode)) { holder.tv_mode.setText("电话拦截"); } else if ("2".equals(mode)) { holder.tv_mode.setText("短信拦截"); } else { holder.tv_mode.setText("全部拦截"); } return view; } 。。。 }</span>
首先更新ListView集合里面的内容,其次通知ListView数据适配器数据更新了。
如:infos.add(info);adapter.notifyDataSetChanged();
其中add(object)方法是添加数据到集合的末尾,可以用add(0,object)方法添加数据到集合的首部。