您的位置:首页 > 移动开发 > Android开发

android本地较大的本地数据显示,cursoradapter的使用

2015-08-19 08:34 417 查看
本文乃菜鸟新作,有误之处,望批评指正,共同学习。

最近在做一个有关android本地数据库数据在listview上显示,原本使用的的Adapter来显示数据,后来发现大数据量的时候,显示卡顿很严重,度娘的解决方法是用CursorAdapter。这里就整理总结一下我这几天学习使用CursorAdapter的成果。

CursorAdapter的方便在哪里?它可以直接处理数据库的查询结果,即Cursor对象。这就使得你在查询数据库后,不需要将数据转换成ArrayList,可以节省不少资源。如果你的数据更新频繁的话,用CursorAdapter的反应速度要比直接用Adapter要快得多。这是指将数据库查询到的数据结果转换成ArrayList保存的情况,如果你继承BaseAdapter也是直接使用Cursor进行数据显示的话,应该也是可以的,毕竟CursorAdapter也是继承自BaseAdapter。但这也会花费我们大量的时间,降低开发的速度,既然有现成的,为什么不用呢?

一个adapter继承CursorAdapter要实现构造函数、newView和bindView;与继承自BaseAdapter有许多相似之处。

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
L.d(TAG + "-newView", cursor.toString());
final View view = mInflater.inflate(R.layout.item_contact, parent,
false);
ViewHolder holder = new ViewHolder();
holder.number = (TextView) view.findViewById(R.id.text_contact_number);
holder.name = (TextView) view.findViewById(R.id.text_contact_name);
holder.checkbox = (CheckBox) view.findViewById(R.id.cb_contact);
holder.user = (ImageView) view.findViewById(R.id.iv_contact_user);
holder.icon = (ImageView) view.findViewById(R.id.iv_contact_icon);
holder.spells = (TextView) view.findViewById(R.id.txt_contact_spells);
holder.rlitem = (RelativeLayout) view.findViewById(R.id.rl_item);
view.setTag(holder);
return view;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
final ViewHolder holder = (ViewHolder) view.getTag();

//这里添加数据的操作



这里ViewHolder 对象我就不写了。

当有大量的数据的时候,一次显示出来还是会导致卡顿明显,所以我们通过重写下面这个方法来控制长度

@Override
public int getCount() {
return showNum;
}

我们可以监听lisview滑动到底端的时候,修改showNum的大小来不断的更新显示的数量,这样就不会因为一次加载太多而导致卡顿了。

listview.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 当不滚动时
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
// 判断是否滚动到底部
if (view.getLastVisiblePosition() == view.getCount() - 1) {
adapter.setShowNum(adapter.getShowNum() + 20);
adapter.notifyDataSetChanged();
}
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {

}
});

在adapter要有showNum的get和set。

public void setShowNum(int showNum) {
if (mCursor.getCount() > showNum) {
this.showNum = showNum;
} else {
this.showNum = mCursor.getCount();
}
}

public int getShowNum() {
return showNum;
}

cursoradapter更新数据很方便,只需要调用adapter.changeCursor(mCursor)就可以刷新数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息