ListView是Android开发中很常见的一个控件。今天在这里说一下它的优化。
1.使用ViewHolder提高效率
一般的模板:
package com.example.android_commonadapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by 前世诀别的一纸书 on 2017/2/28.
*/
public class MyAdapter extends BaseAdapter {
private LayoutInflater mLayoutInflater = null;
private List<Bean> mDatas = null;
public MyAdapter(Context cotnext, List<Bean> datas)
{
mDatas = datas;
mLayoutInflater = LayoutInflater.from(cotnext);
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null)
{
holder = new ViewHolder();
convertView = mLayoutInflater.inflate(R.layout.item_layout, parent, false);
holder.mImageView = (ImageView) convertView.findViewById(R.id.id_imageView);
holder.mTextViewTitle = (TextView) convertView.findViewById(R.id.id_textViewTitle);
holder.mTextViewContent = (TextView) convertView.findViewById(R.id.id_textViewContent);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Bean bean = mDatas.get(position);
holder.mImageView.setImageResource(bean.mImageViewIcon);
holder.mTextViewTitle.setText(bean.mTextViewTitle);
holder.mTextViewContent.setText(bean.mTextViewContent);
return convertView;
}
private class ViewHolder
{
public ImageView mImageView = null;
public TextView mTextViewTitle = null;
public TextView mTextViewContent = null;
}
}
2.设置项目间分割线
系统给我们提供了divider和dividerHeight属性来帮助我们实现这个功能。分割线不仅仅可以设置为一个颜色,还可以是图片资源。
android:divider="" //可以是一个颜色,也可以是图片资源
android:dividerHeight="10dp"
特殊情况下,我们也可以利用android:divider="@null",将分割线设置为透明
3.设置ListView需要显示在第几项
ListView是以Item为单位来进行显示的,默认显示在第一个Item,当需要指定具体显示的Item,可以通过如下代码:
listView.setSelection(int position);
上面的方式类似scrollTo,是瞬间完成的移动。除此之外,我们还可以使用如下的代码来实现平滑移动:
listView.smoothScrollBy(int distance, int duration);
listView.smoothScrollByOffset(int offset);
listView.smoothScrollToPosition(int index);
4.处理空ListView
ListView用来展示列表数据的,但是当列表中没有数据时,ListView是不会显示任何的数据的,为了满足用户的需求,当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="com.example.android_demo.MainActivity" >
<ListView
android:id="@+id/id_listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
<ImageView
android:id="@+id/id_imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</FrameLayout>
listView = findViewById(R.id.id_listView);
imageView = findViewById(R.id.id_imageView);
listView.setEmptyView(imageView);
5.OnScrollListener
OnScrollListener是AbsListView中监听事件,它封装了与ListView操作的信息。
// 在滑动状态改变的时候调用
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
// 滑动停止
case OnScrollListener.SCROLL_STATE_IDLE: {
break;
}
//正在滑动
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
{
break;
}
//当手指离开屏幕,但是listView由于惯性的原因,仍然在滑动
case OnScrollListener.SCROLL_STATE_FLING:
{
break;
}
}
}
// 滑动的时候调用
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}