自定义ListView控件在滑动的过程中动态提示item(四)

在开发中,很多情况是通过自定义控件来实现一些功能比较完善,控件比较漂亮的效果。 本篇博客讲解如何使用自定义ListView控件来动态显示当前滑动到哪个Item了。

效果图:

自定义ListView控件在滑动的过程中动态提示item(四)_第1张图片

当手指滑动的时候,每当item划过屏幕顶端时图片上就会动态显示出该数字。

先自定义ListView控件,然后重新它的三个构造函数。

public class BaseListView extends ListView {

    public BaseListView(Context context) {
        super(context, null);
        init();
    }

    public BaseListView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
        init();
    }

    public BaseListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    /** * init,不让ListView暴力滑动 */
    @SuppressLint({ "InlinedApi", "NewApi" })//标注忽略的警告
    private void init() {
        if (Build.VERSION.SDK_INT >= 9) {
            setOverScrollMode(View.OVER_SCROLL_NEVER);
        }
    }

    /** * ListView控件中自定义接口,要使用该控件必须实现里面的方法 */
    public interface DispatchKeyListener {
        public void onDispatchKeyEvent(MotionEvent event);
    }

    public DispatchKeyListener dispatchKeyListener;
    /** * 该方法是触摸事件分发机制中第一个被调用的方法,用于分发触摸操作 */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        dispatchKeyListener.onDispatchKeyEvent(ev);
        return super.dispatchTouchEvent(ev);
    }

}

由dispatchTouchEvent(ev)方法接收用户触摸操作,事件向下分发。 onInterceptTouchEvent是ViewGroup提供的方法,默认返回false,返回true表示拦截。 onTouchEvent是View中提供的方法,ViewGroup也有这个方法,view中不提供onInterceptTouchEvent。view中默认返回true,表示消费了这个事件。

这是事件分发机制中的一点小的知识

ListView布局中声明

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.example.listtoastdemo.BaseListView  <!-- 该路径是自定义ListView控件的包名 -->
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fadingEdge="none" />

    <TextView
        android:id="@+id/toast"
        android:layout_width="70dp"
        android:layout_height="48dp"
        android:layout_gravity="center"
        android:background="@drawable/toast_blue"
        android:padding="3dip"
        android:visibility="gone" />

</FrameLayout>

Activity中的代码:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initListView();
    }

    private int lastItemIndex;

    private TextView toast;

    private BaseListView list;

    /** * 用于初始化ListView控件的 */
    private void initListView() {
        lastItemIndex = -1;
        toast = (TextView) findViewById(R.id.toast);
        list = (BaseListView) findViewById(R.id.list);
        /** * 实现ListView里面接口的onDispatchKeyEvent * 如果要执行dispatchTouchEvent,必须先执行该方法 */
        list.dispatchKeyListener = new DispatchKeyListener() {

            @Override
            public void onDispatchKeyEvent(MotionEvent event) {
                switch (event.getAction()) {
                    case KeyEvent.ACTION_UP:
                        toast.setVisibility(View.GONE);
                        break;
                    default:
                        if (toast.getVisibility() != View.VISIBLE) {
                            toast.setVisibility(View.VISIBLE);
                        }
                        if (list.getFirstVisiblePosition() != lastItemIndex) {
                            lastItemIndex = list.getFirstVisiblePosition();
                            String num = (String) list.getAdapter().getItem(
                                    lastItemIndex);//获得listView每个item的数值 比如 1, 2 ,3之类的
                            num = num.substring(0, 1);
                            String str = getResources().getString(R.string.first_num_format);//初始化字符串 first num is
                            str = String.format(str, num);
                            toast.setText(str);
                        }
                        break;
                }
            }
        };
        // 初始化ListView的适配器的
        int num = 150;
        String[] array = new String[num];
        for (int i = 0; i < num; i++) {
            array[i] = String.valueOf(i);
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, array);//android.R.layout.simple_list_item_1是安卓中ListView布局表示 列表选项的简单布局
        list.setAdapter(adapter);
    }

}

然后,运行代码,TextView就会像Toast一样动态的显示文本。 这个只是自定义ListView的简单实现,当然还有更漂亮,更实用的,稍后会讲到。

你可能感兴趣的:(ListView,自定义控件,自定listview)