ListView使用技巧、优化和用法拓展,掌握ListView全系列

版权声明:本文是博主原创文章,不得转载本文任何内容。原文地址: https://blog.csdn.net/smile_Running/article/details/81902040

                         【声明】:未经许可,禁止转载!

· 介绍

    ListView,众所周知,这是一个android中元老级别的控件之一了。虽然,我们现在大多数都用RecyclerView来替代它,但是它还是在我们初学者的必备知识点里。当然,它相对于RecyclerView来说,用法还是偏于简单的。因为ListView已经给我们封装好了太多的功能性的方法,我们只要会用就可以实现一个非常美观的UI效果。正是因为这些封装好的方法,导致它特别的繁重,所以可定制性无法和RecyclerView相提并论了。

    但是,它在我们初学者的眼里,真的是一个神器。比如我们看看以下的一些方法,你会体会到它的易用性。首先,我开始介绍一下它的用法以及适配器的优化。

先来看一下这样的效果图,也是后面的对比图:

· ListView使用攻略

     在代码中设置和在布局文件中设置属性是一样的效果,以下只提供一种方式,举一反三。

一、ListView的适配器优化,提高效率

适配器模板代码(使用ViewHolder模式提高效率):

/**
 * @Created by xww.
 * @Creation time 2018/8/21.
 */

public class ListViewAdapter extends BaseAdapter {

    private ArrayList<ContactEntity> mData;

    ListViewAdapter(ArrayList<ContactEntity> data) {
        this.mData = data;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_content, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.civPhoto.setImageResource(mData.get(position).getmPhoto());
        holder.tvName.setText(mData.get(position).getmName());
        holder.tvMessage.setText(mData.get(position).getmMessage());
        return convertView;
    }

    static class ViewHolder {
        CircleImageView civPhoto;
        TextView tvName;
        TextView tvMessage;

        ViewHolder(View itemView) {
            civPhoto = itemView.findViewById(R.id.item_image);
            tvName = itemView.findViewById(R.id.item_name);
            tvMessage = itemView.findViewById(R.id.item_message);
        }
    }
}

二、ListView的左侧滚动条,设置显示/隐藏(默认显示)

效果图:

1、在layout布局文件中的ListView下设置

        android:scrollbars="none"

2、在代码中设置

        lvContact.setVerticalScrollBarEnabled(false);

三、ListView的Item分割线,设置显示/隐藏(默认显示)、分割线高度

隐藏分割线效果图:

1、设置隐藏分割线

        lvContact.setDivider(null);

设置分割线高度效果图:

2、设置分割线高度

        lvContact.setDividerHeight(15);

自定义分割线效果图:

3、设置自定义的分割线

        lvContact.setDivider(ContextCompat.getDrawable(this, R.drawable.item_divider));

四、取消ListView的Item点击效果

点击了无水波扩散效果:

        //颜色值
        <color>#00000000</color>

        lvContact.setSelector(R.color.colorSelector);

五、无数据时,处理空ListView

当ListView无数据时:

布局:

<android.support.constraint.ConstraintLayout 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="listview.example.x.slidelistview.MainActivity">

    <ListView
        android:id="@+id/lv_contact"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    /** 自己选择无数据时显示的图片,我这里随便选了一张,效果不是很好 **/
    <ImageView
        android:id="@+id/empty_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/no_data" />
</android.support.constraint.ConstraintLayout>

代码:

        ImageView view = findViewById(R.id.empty_view);
        lvContact.setEmptyView(view);

六、ListView添加HeaderView和FooterView

        View headerView = LayoutInflater.from(this).inflate(R.layout.header_view, null);
        View footerView = LayoutInflater.from(this).inflate(R.layout.footer_view, null);
        lvContact.addHeaderView(headerView);
        lvContact.addFooterView(footerView);

七、ListView获得可视区域内的Item

        //获得可见区域内第一个Item的位置,包括显示一半、一点
        mListView.getFirstVisiblePosition();
        //获得可见区域内最后一个Item的位置,同上
        mListView.getLastVisiblePosition();

八、ListView的滑动监听函数介绍

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
            case SCROLL_STATE_IDLE: // 滑动停止时
                break;
            case SCROLL_STATE_TOUCH_SCROLL: // 正在滚动
                break;
            case SCROLL_STATE_FLING: // 手指用力滑动后,由于惯性继续再滚动
                break;
        }
    }

    /**
     * ListView在滚动时一直会回调这个方法
     *
     * @param firstVisibleItem //第一个可见区域内Item位置
     * @param visibleItemCount // 最后一个可见区域内Item位置
     * @param totalItemCount   // 总的Item个数
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //判断Listview是否到达顶部
        isTop = firstVisibleItem == 0;
        //判断Listview是否到达底部
        isBottom = firstVisibleItem + visibleItemCount == totalItemCount;
    }

博主文章推荐

一、自定义ListView之:仿联系人拥有首字母排序、查询及定位功能的ListView

二、自定义SlideListView之:一步步实现ListView的Item侧滑删除菜单效果,仿QQ的聊天页面侧滑删除

三、自定义RefreshListView之:ListView添加下拉刷新、上拉加载,其实很简单

四、富有弹性的自定义ListView:ListView边界回弹效果

五、为ListView添加自定义DrawerLayout(抽屉):为之前的自定义View添加自定义DrawerLayout(侧拉抽屉),为自定义View系列画上完美句号。

©版权所有:https://blog.csdn.net/smile_Running/article/details/81902040

猜你喜欢

转载自blog.csdn.net/smile_Running/article/details/81902040