上面一篇文章我们学习完了 字母的列表的显示,但是里面我们点击一个字母 马上跳到该字母对应的城市,并且在视图上面显示一个自定义吐司
这些事件的处理是怎么样完成的呢?
这些都是在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());