接口下多个实现方法的解决方案

来源:互联网 发布:电子听诊器 分析软件 编辑:程序博客网 时间:2024/06/07 10:57

在实际开发中,我们经常遇到这样的问题:有时我们需要实现一个接口,却不得不实现一下该接口中所有的抽象方法,即使我们用不到这些方法。在开发中多遇到的便是:

vpContent.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {mPagerList.get(position).initData();}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {// TODO Auto-generated method stub}@Overridepublic void onPageScrollStateChanged(int state) {// TODO Auto-generated method stub}});
即使onPageScrolled方法和onPageScrollStateChanged我们什么也不做。但是这样遇到的问题是代码显得太啰嗦。

更有甚者,有的接口的实现方法太多了,很多我们可能只需要其中的一个方法。诸如百度地图的API:

search.init(manager, new MKSearchListener() {@Overridepublic void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onGetPoiDetailSearchResult(int arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void onGetAddrResult(MKAddrInfo arg0, int arg1) {// TODO Auto-generated method stub}});
有没有头大的赶脚?别着急,其实在android api中已经有个这样问题的解决方案。

OK,打开ViewPager.java,于是我们可以看到在ViewPager一下源码:

  /**     * Callback interface for responding to changing state of the selected page.     */    public interface OnPageChangeListener {        /**         * This method will be invoked when the current page is scrolled, either as part         * of a programmatically initiated smooth scroll or a user initiated touch scroll.         *         * @param position Position index of the first page currently being displayed.         *                 Page position+1 will be visible if positionOffset is nonzero.         * @param positionOffset Value from [0, 1) indicating the offset from the page at position.         * @param positionOffsetPixels Value in pixels indicating the offset from position.         */        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);        /**         * This method will be invoked when a new page becomes selected. Animation is not         * necessarily complete.         *         * @param position Position index of the new selected page.         */        public void onPageSelected(int position);        /**         * Called when the scroll state changes. Useful for discovering when the user         * begins dragging, when the pager is automatically settling to the current page,         * or when it is fully stopped/idle.         *         * @param state The new scroll state.         * @see ViewPager#SCROLL_STATE_IDLE         * @see ViewPager#SCROLL_STATE_DRAGGING         * @see ViewPager#SCROLL_STATE_SETTLING         */        public void onPageScrollStateChanged(int state);    }
在这些代码后,我们也可以看到:

/**     * Simple implementation of the {@link OnPageChangeListener} interface with stub     * implementations of each method. Extend this if you do not intend to override     * every method of {@link OnPageChangeListener}.     */    public static class SimpleOnPageChangeListener implements OnPageChangeListener {        @Override        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            // This space for rent        }        @Override        public void onPageSelected(int position) {            // This space for rent        }        @Override        public void onPageScrollStateChanged(int state) {            // This space for rent        }    }

简单翻译一下:SimpleOnPageChangeListener是对OnPageChangeListener的简单实现,如果你不需要实现OnPageChangeListener中的每一个方法,可以继承这个类。

针对百度地图API中特别复杂的MKSearchListener,于是我们便可以做一个简单的实现类了。代码如下:

protected class MyMKSearchListener implements MKSearchListener {@Overridepublic void onGetAddrResult(MKAddrInfo result, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetBusDetailResult(MKBusLineResult result, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetPoiDetailSearchResult(int type, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetPoiResult(MKPoiResult result, int type, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetSuggestionResult(MKSuggestionResult result, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {// TODO Auto-generated method stub}@Overridepublic void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {// TODO Auto-generated method stub}}
OK。编写完成。

这也是24设计模式中比较简单的一个设计模式的简单实现-适配器设计模式。有时间自己研究一下。





0 0
原创粉丝点击