您的位置:首页 > 其它

listview的优化及分页算法

2017-12-20 21:14 225 查看
listView优化

1:复用convertView

2:复用ViewHolder让其减少findViewById()次数

3:static ViewHolder

4:分页算法

class MyAdapter extends BaseAdapter {

@Override
public int getCount() {
// TODO Auto-generated method stub
return mBlackNumberList.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mBlackNumberList.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = View.inflate(getApplicationContext(),
R.layout.listview_blacknumber_item, null);
holder.tv_blacknumber = (TextView) convertView
.findViewById(R.id.tv_blacknumber);
holder.tv_blackmode = (TextView) convertView
.findViewById(R.id.tv_blackmode);
holder.iv_black_delete = (ImageView) convertView
.findViewById(R.id.iv_black_delete);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.tv_blacknumber.setText(mBlackNumberList.get(position)
.getPhone());
switch (Integer.parseInt(mBlackNumberList.get(position).getMode())) {
case 1:
holder.tv_blackmode.setText("屏蔽短信");
break;
case 2:
holder.tv_blackmode.setText("屏蔽电话");
break;
case 3:
holder.tv_blackmode.setText("屏蔽所有");
break;
}

return convertView;
}
}

static class ViewHolder {
TextView tv_blacknumber;
TextView tv_blackmode;
ImageView iv_black_delete;
}

分页算法
在BlackNumberDao中创建find(String index)方法,设置每页显示10条,关键是Sql语句。

//查一部分
public List<BlackNumberInfo> find(int index) {
SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase();
Cursor cursor = db.rawQuery("select phone,mode from blacknumber order by _id desc limit ?,10;", new String[]{index + ""});
List<BlackNumberInfo> list = new ArrayList<BlackNumberInfo>();
while(cursor.moveToNext()) {
BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
blackNumberInfo.setPhone(cursor.getString(0));
blackNumberInfo.setMode(cursor.getString(1));
list.add(blackNumberInfo);
}
cursor.close();
db.close();
return list;
}得到集合后,分析加载多页的逻辑,
加载更多的触发条件

1.监听状态改变

2.滚动到最底部,最后一个listView的条目可见

3.滚动状态发生改变 滚动------>停止(空闲)

加载下一页数据完成后,需要添加到上一页数据的最后面
lv_blacknumber = (ListView) findViewById(R.id.lv_blacknumber);
lv_blacknumber.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (mDao.getCount() > mBlackNumberList.size()) {

if (scrollState == SCROLL_STATE_IDLE
&& lv_blacknumber.getLastVisiblePosition() >= mBlackNumberList
.size() - 1 && !mIsLoad) {
new Thread() {
public void run() {
List<BlackNumberInfo> moreList = mDao
.find(mBlackNumberList.size());
mBlackNumberList.addAll(moreList);
mHandler.sendEmptyMessage(0);
};
}.start();
mIsLoad = !mIsLoad;
}
}
}
private Handler mHandler = new Handler() {

public void handleMessage(android.os.Message msg) {
if (myAdapter == null) {
myAdapter = new MyAdapter();
lv_blacknumber.setAdapter(myAdapter);
} else {
myAdapter.notifyDataSetChanged();
}

};
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: