博主声明:
转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。
本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/smile_running
ListView,众所周知,这是一个android中元老级别的控件之一了。虽然,我们现在大多数都用RecyclerView来替代它,但是它还是在我们初学者的必备知识点里。当然,它相对于RecyclerView来说,用法还是偏于简单的。因为ListView已经给我们封装好了太多的功能性的方法,我们只要会用就可以实现一个非常美观的UI效果。正是因为这些封装好的方法,导致它特别的繁重,所以可定制性无法和RecyclerView相提并论了。
但是,它在我们初学者的眼里,真的是一个神器。比如我们看看以下的一些方法,你会体会到它的易用性。首先,我开始介绍一下它的用法以及适配器的优化。
先来看一下这样的效果图,也是后面的对比图:
在代码中设置和在布局文件中设置属性是一样的效果,以下只提供一种方式,举一反三。
适配器模板代码(使用ViewHolder模式提高效率):
/**
* @Created by xww.
* @Creation time 2018/8/21.
*/
public class ListViewAdapter extends BaseAdapter {
private ArrayList mData;
ListViewAdapter(ArrayList 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);
}
}
}
效果图:
1、在layout布局文件中的ListView下设置
android:scrollbars="none"
2、在代码中设置
lvContact.setVerticalScrollBarEnabled(false);
隐藏分割线效果图:
1、设置隐藏分割线
lvContact.setDivider(null);
设置分割线高度效果图:
2、设置分割线高度
lvContact.setDividerHeight(15);
3、设置自定义的分割线
lvContact.setDivider(ContextCompat.getDrawable(this, R.drawable.item_divider));
点击了无水波扩散效果:
//颜色值
#00000000
lvContact.setSelector(R.color.colorSelector);
当ListView无数据时:
布局:
/** 自己选择无数据时显示的图片,我这里随便选了一张,效果不是很好 **/
代码:
ImageView view = findViewById(R.id.empty_view);
lvContact.setEmptyView(view);
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);
//获得可见区域内第一个Item的位置,包括显示一半、一点
mListView.getFirstVisiblePosition();
//获得可见区域内最后一个Item的位置,同上
mListView.getLastVisiblePosition();
@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;
}