2014-10-27Android学习------自定义widget的监听事件的实现-----城市列表应用程序

2022-03-07 08:37:04 浏览数 (1)

上面一篇文章我们学习完了 字母的列表的显示,但是里面我们点击一个字母 马上跳到该字母对应的城市,并且在视图上面显示一个自定义吐司

这些事件的处理是怎么样完成的呢?

这些都是在activity类里面实现的,下面我们来看看它到底是怎么实现的:

学习这篇文章,如果看不明白 请先看上面的文章 地址:http://blog.csdn.net/u014737138/article/details/40591505

1.自定义 26个字母列表的监听事件接口的实现

我们知道很多的widget都有监听事件,比如说btn.setOnClickListener()等等,当我们想去实现它的时候,我们必须重载OnClick(View view)方法

自定义构件也是一样的原理,还记得 在上节的自定义26个字母列表的构件中 我们定义了一个接口吗? 触摸字母改变监听器接口

在这个类中:public class MyLetterListView extends View public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener)

代码语言:javascript复制
	{
		
		this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
	}


	public interface OnTouchingLetterChangedListener
	{
		public void onTouchingLetterChanged(String s);
	}

这个是该自定义接口的内部接口 如果我们把它显示在我们的布局文件中,又想去监听一些触摸事件,那么我们必须在自定义构件中定义这个接口

然后在使用它的时候去实现未实现的方法

那么在我们activity类中必须首先要干的事就是定义出一个class 它实现这个接口,实现这个接口里面的方法

import com.wust.citylist.activity.MyLetterListView.OnTouchingLetterChangedListener;

代码语言:javascript复制
	private class LetterListViewListener implements OnTouchingLetterChangedListener
	{

		@Override
		public void onTouchingLetterChanged(final String s)
		{
			if (alphaIndexer.get(s) != null)
			{
				int position = alphaIndexer.get(s);
				mCityLit.setSelection(position);
				overlay.setText(sections[position]);
				overlay.setVisibility(View.VISIBLE);
				handler.removeCallbacks(overlayThread);
				// 延迟一秒后执行,让overlay为不可见
				handler.postDelayed(overlayThread, 1500);
			}
		}

	}

看看上面的代码 :这是一个类,它在这个类面:public class CityList extends Activity

你也可以把它单独写成一个文件,但是由于这个类中用到了一些类的变量,为了避免麻烦,这里也就这样干了

内部类有个好处:就是当主类创建的时候,这个内部类也就创建了,直接可以调用了,但是它有时候会浪费不必要的内存空间

还是说说这个函数的用处吧:

首先这个类是 implements OnTouchingLetterChangedListener这个接口的,我们需要导入这个接口,看上面:

这个时候Eclipse会提示你要实现未实现的方法:public void onTouchingLetterChanged(final String s)

变量:private HashMap<String, Integer> alphaIndexer;// 存放存在的汉语拼音首字母和与之对应的列表位置

变量:private String[] sections;// 存放存在的汉语拼音首字母

变量:private OverlayThread overlayThread;//是一个用来显示自定义吐司的线程实例类对象,它的作用是当我们点击一个字母后,让这个字母一种自定义的方式显示一段时间

变量:private Handler handler;// import android.os.Handler; 这里请看上篇文章 Handler对象就是利用线程处理消息机制的

上篇文章的地址 http://blog.csdn.net/u014737138/article/details/40591505

if (alphaIndexer.get(s) != null) {// 根据上篇文章的分析,我们知道这个函数传递过来的参数是一个字母,那么根据这个字母我们得到列表的索引 [] int position = alphaIndexer.get(s);//获得列表的索引 mCityLit.setSelection(position);//根据这个索引设置界面上要显示的那个字母位置 overlay.setText(sections[position]);//设置我们自定义的吐司的文本 overlay.setVisibility(View.VISIBLE);//设置吐司的可见 handler.removeCallbacks(overlayThread);// 让这个线程停止运行,因为上一步触摸导致这个线程处于运行中 // 延迟1.5秒后执行,让overlay为不可见 handler.postDelayed(overlayThread, 1500);//先让文本显示1.5秒,然后调用线程告诉它不能再显示了,消失吧! }

到这里位置 我们就搞定了这个自定义控件的监听事件了,下面就是如何去调用它了

1.定义这个控件变量:private MyLetterListView letterListView;

2.在onCreate(Bundle)函数里面去找到这个自定义控件了

letterListView = (MyLetterListView) findViewById(R.id.cityLetterListView);

3.设置点击响应事件

letterListView.setOnTouchingLetterChangedListener(new LetterListViewListener());

0 人点赞