吐司的移动,多次点击事件,holder优化ListView,更新ListView

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>

32.动态更新ListView

首先更新ListView集合里面的内容,其次通知ListView数据适配器数据更新了。

如:infos.add(info);adapter.notifyDataSetChanged();

其中add(object)方法是添加数据到集合的末尾,可以用add(0,object)方法添加数据到集合的首部

你可能感兴趣的:(吐司的移动,多次点击事件,holder优化ListView,更新ListView)