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

本文乃菜鸟新作,有误之处,望批评指正,共同学习。

最近在做一个有关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)就可以刷新数据。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值