Android 彻底征服 ListView 一 (实用篇)

ListView使用技巧

对于Android开发,相信ListView这个控件大家一定不会陌生,它的重要性不言而喻,它的功能纷繁复杂,在项目中的表现形式灵活多变,要想得心应手的使用不并容易,今天带领大家一起领略ListView的风采.

1.使用ViewHolder

 @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if(view==null){
            holder=new ViewHolder();
            view=mInflater.inflate(R.layout.viewholdernotifyadapter,null);
            holder.img= (ImageView) view.findViewById(R.id.imageView);
            holder.title= (TextView) view.findViewById(R.id.textView);
            view.setTag(holder);
        }else{
            holder= (ViewHolder) view.getTag();
        }
        holder.img.setImageResource(R.mipmap.ic_launcher);
        holder.title.setText(mData.get(i));
        return view;
    }
    public final class ViewHolder{
        private ImageView img;
        private TextView title;
    }

2.设置项目间分隔线

android:divider="@android:color/darker_gray"//设置分割线
android:dividerHeight="10dp"//设置分隔线高度
android:divider="@null"//隐藏分割线

3.隐藏ListView的滚动条

android:scrollbars="none"//隐藏ListView滚动条

4.取消ListView的Item点击效果

android:listSelector="@android:color/transparent"//取消ListView的Item点击效果

5.设置ListView需要显示在第几项

listView.setSelection(N);//默认显示在第N个Item,(N为第N个Item)(瞬时完成)
//平滑移动
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);

6.动态修改ListView

使用adapter.notifyDataSetChanged();通知ListView更改数据源对ListView动态修改,必须保证传入Adapter的数据List是同一个List而不能是其他对象,否则无法实现该效果

 public void btnAddItem(View view){
        mData.add("哈哈哈");
        adapter.notifyDataSetChanged();//通知Adapter更新数据
        listView.setSelection(mData.size()-1);
    }

7.遍历ListView中的所有Item

通过getChildAt()来获取第i个子View.

 for (int i = 0; i < listView.getChildCount(); i++) {
            View view = listView.getChildAt(i);
        }

8.处理空ListView

通过setEmptyView(),在LiseView无数据的情况下显示默认的提示

 <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:divider="@android:color/darker_gray"
            android:dividerHeight="10dp"
            android:listSelector="@android:color/transparent"
            android:scrollbars="none"></ListView>

        <ImageView
            android:id="@+id/empty_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@mipmap/ic_launcher" />
    </FrameLayout>
ListView listView = (ListView) findViewById(R.id.listView);
listView.setEmptyView(findViewById(R.id.empty_view));

9.ListView滑动监听

监听ListView滑动事件的方法主要有两种:一个是通过OnTouchListener来实现监听,另一个是使用OnScrollListener来实现监听,通常还需要使用GestureDetector手势识别,VelocityTracker滑动速度检测来实现更好监听.

9.1 OnTouchListener

OnTouchListener是View中的监听事件,通过监听 ACTION_DOWN ACTION_MOVE ACTION_UP 这三个事件发生时的坐标,判断用户滑动的方向,在不同的事件中进行相应的逻辑处理.

 mListView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //触摸时操作
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //移动时操作
                        break;
                    case MotionEvent.ACTION_UP:
                        //离开时操作
                        break;
                }
                return false;
            }
        });

9.2 OnScrollListener

OnScrollListener是AbsListView中的监听事件

   mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView absListView, int scrollState) {
                switch (scrollState) {
                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                        //滑动停止时
                        Log.d("tag", "SCROLL_STATE_IDLE");
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                        //正在滚动
                        Log.d("tag", "SCROLL_STATE_TOUCH_SCROLL");
                        break;
                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                        //手指抛动时  即手指用力滑动  在离开后ListView由于惯性继续滑动
                        Log.d("tag", "SCROLL_STATE_FLING");
                        break;
                }
            }
            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //滚动时一直调用
                Log.d("tag", "onScroll");
            }
        });

OnScrollListener中有两个回调方法–onScrollStateChanged()和onScroll().

onScrollStateChanged()根据它的参数scrollState来决定其回调的次数,scrollState有以下三种模式:

OnScrollListener.SCROLL_STATE_IDLE:滚动停止时.

OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:正在滚动时.

OnScrollListener.SCROLL_STATE_FLING:手指抛动时,即手指用力滑动,在离开后ListView由于惯性继续滑动的状态.

没有抛动状态时,回调2次,否则回调3次.

onScroll()在ListView滚动时一直回调,它有3个参数可以非常精确地显示当前ListView的滚动状态,

firstVisibleItem:当前能看见的第一个Item的ID(从0开始).

visibleItemCount:当前能看见的Item总数.

totalItemCount:整个ListView的Item总数.

当前能看见的Item数,包括没有显示完整的Item,即显示一小半的Item也包括在内.

//判断是否滚动到最后一行
//当前可视的另一个Item的ID加上当前可视Item的和等于Item总数的时候,即滚动到了最后一行.
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
                    //滚动到最后一行
    }
//判断滚动的方向
//通过一个成员变量lastVisibleItemPosition来记录上次第一个可视的Item的ID并与当前的可视Item的ID进行比较,即可知道当前滚动的方向
if (firstVisibleItem > lastVisibleItemPosition) {
                    //上滑
     } else if (firstVisibleItem < lastVisibleItemPosition) {
                    //下滑
    }
lastVisibleItemPosition = firstVisibleItem;
//获取可视区域内最后一个Item的id
mListView.getLastVisiblePosition();
//获取可视区域内第一个Item的id
mListVIew.geFirstVisiblePosition();

ListView例子下载链接

未完待续…

时间: 2024-12-28 21:50:15

Android 彻底征服 ListView 一 (实用篇)的相关文章

Android基础入门教程——2.4.2 ListView简单实用

Android基础入门教程--2.4.2 ListView简单实用 标签(空格分隔): Android基础入门教程 本节引言: 一口气把Android入门网络编程的章节写完了,本节我们来继续学习没有讲完的UI控件部分, 回顾上一节,我们介绍了Adapter适配器的概念,然后学习了三个最简单的适配器的使用: ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,而本节给大家讲解的是第一个 需搭配Adapter使用的UI控件:ListView,不过在版本中被R

【Android UI】ListView系列一(基础篇)

----–ListView基础 ListView是一个用于显示滚动的列表项的视图组.listview通过一个适配器adapter将数据以列表的形式展示出来.listview可以说是Android应用层开发非常重要的组件之一,几乎每个App都有它的身影,通过适配器可以使listview呈现出各种不同的样式和风格,作为Android开发人员必须熟练掌握. 下面介绍一下listview的一些常用属性: 1.divider属性:在列表条目之间显示的可绘制对象或颜色. 布局代码 <RelativeLayo

Android ListView简单实用

layout创建: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:orientation="vertical" andro

【Android UI】ListView系列二(自定义Adapter订阅新闻栏目)

目标:自定义适配器Adapter实现点击每个item订阅按钮 上一篇介绍了listview的基本属性以及ArrayAdapter和SimpleAdapter的简单实用,链接:listview使用方式基础篇. 今天主要介绍一下自定义adapter,来实现稍微复杂点的功能,今天实现的效果是:类似于listiew展示许多可供订阅的栏目,每个栏目最右端有订阅按钮,用户点击订阅可以订阅该栏目,再次点击可取消订阅,效果图如下,下面我们一步步来实现. 1. 定义主布局文件activity_main.xml 主

Android—自定义控件实现ListView下拉刷新

这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的代码是自定的扎样的控件: package com.dhsr.smartID.view; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import andr

Xamarin.Android之使用百度地图起始篇

一.前言 如今跨平台开发层出不穷,而对于.NET而言时下最流行的当然还是Xamarin,不仅仅能够让我们在熟悉的Vs下利用C#开发,在对原生态类库的支持方面也有着非常的好支持,今天我们将会以百度地图类库来介绍如何实用第三方原生态类库. 二.正文 笔者采用的是3.0.0的版本,需要以下文件: baidumapapi_v3_0_0.jar libBaiduMapSDK_v3_0_0.so 1.新建项目 2.将baidumapapi_v3_0_0.jar赋值到Jars文件夹下 3.修改其属性 4.如果

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

Android PullToRefresh (ListView GridView 下拉刷新) 使用详解 标签: Android下拉刷新pullToRefreshListViewGridView 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-r

【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法

Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的..... 需求: 在listview中出一个EditText 接受用户输入消息. 前期解决方案: 给这个EditText绑定焦点事件.... 悲剧就开始了... 知道吗?当这个EditTextView被点了下,它的焦点就不断的获取,失去,获取,失去...  只点一下... 就频繁的重复..最后大部

Android UI--自定义ListView(实现下拉刷新+加载更多)

http://blog.csdn.net/wwj_748/article/details/12512885 Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈: