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

写一篇文章很辛苦啊

转载请注明  ,联系请邮件nlp30508

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

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

这些都是在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)

	{
		
		this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
	}


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

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

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


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

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

	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());


至此就完成了自定义widget的监听事件了    


转载请注明  ,联系请邮件nlp30508








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值