listview优化,viewHolder ,分页




public class BlackNumberActivity extends Activity {


private ListView lv_black_number;
private BlackNumberDao blackNumberDao;
private List<BlackNumberInfo> list = new ArrayList<BlackNumberInfo>();
private BlackNumberAdapter mAdapter;
// 查询数据记录的起始位置
private int startIndex = 0;
private RelativeLayout rl_progress_container;
private ImageView iv_empty_view;


private boolean isLoading = false;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {


if (startIndex == 0) { // 显示第一页数据时
mAdapter = new BlackNumberAdapter();
lv_black_number.setAdapter(mAdapter);
} else {
// 刷新listview,在它后面追加条目
mAdapter.notifyDataSetChanged();
}


// 给listview设置空的view
lv_black_number.setEmptyView(iv_empty_view);
// 执行到这个位置表示新的一页数据加载完成
isLoading = false;

// 隐藏进度界面
rl_progress_container.setVisibility(View.INVISIBLE);
};
};




@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


setContentView(R.layout.activity_black_number);
// 1.在BlackNumberActivity中初始化listview;
lv_black_number = (ListView) findViewById(R.id.lv_black_number);

rl_progress_container = (RelativeLayout) findViewById(R.id.rl_progress_container);

iv_empty_view = (ImageView) findViewById(R.id.iv_empty_view);


// 2.准备数据:查询数据库,把黑名单记录放到list集合中;
blackNumberDao = new BlackNumberDao(this);
initData();


// 给listview添加滚动的监听器,让它能够知道滚动条已经滚动到listview的底部
lv_black_number.setOnScrollListener(new OnScrollListener() {


/**
* 滚动的状态发生变化时调用这个方法 view :当前listview scrollState
* 滚动的状态:OnScrollListener.SCROLL_STATE_FLING:惯性滑动状态
* OnScrollListener.SCROLL_STATE_IDLE:停止状态;
* OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:触摸滑动状态;
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {


switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE: // 停止状态;


// 得到数据库中黑名单记录单总数
   long totalCount = blackNumberDao.getTotalCount();
// 判断滚动条是否滚到listview的底部
// 判断当前界面最后一个条目的索引位置是不是等list.size()-1,如果是就表示滚动到了listview的底部,就应该加载下一页数据
int lastPosition = lv_black_number.getLastVisiblePosition(); // 得到listview中最后一个可见条目的索引位置
if (lastPosition == list.size() - 1 && !isLoading) {

if(totalCount == list.size()){ // 表示数据已经加载完毕
System.out.println("======哥哥不要再滑了,已经到底了==========================");
}else{
// 表示当前正在加载下一页的数据
isLoading = true;            
// 得到当前界面中第一个可见条目的索引位置
int firstPosition = lv_black_number
.getFirstVisiblePosition();
// 重新设置查询下一页数据的起始位置
lv_black_number.setSelection(firstPosition);
startIndex +=10;
// listview中现实的第一个条目应该是下一页数据的第一条记录
// 这个方法调用了查询下一页的方法
initData();
}

}

break;


case OnScrollListener.SCROLL_STATE_FLING: // 惯性滑动状态


break;


case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动状态;


break;
}



}


/**
* 在滚动的过程中调用这个方法 view :当前listview firstVisibleItem
* 在当前界面中看到的第一个条目在listview中的索引位置 visibleItemCount 当前可见的条目的个数
* totalItemCount listview中可以显示的条目的总数
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {


}
});


}


// 2.准备数据:查询数据库,把黑名单记录放到list集合中;
private void initData() {
new Thread() {


public void run() {
         
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

// 从数据库中查询所有的黑名单数据
// list = blackNumberDao.queryAll(  );
// 每次查询10条数据
if (startIndex == 0) {// 表示查询第一页数据
list = blackNumberDao.queryPart(startIndex);

} else {
// 应该把下次查询的结果追加到list后的后面 就是list中又添加了10条数据
list.addAll(blackNumberDao.queryPart(startIndex));
}


// lv_black_number.setAdapter(adapter)
handler.sendEmptyMessage(0);
};
}.start();


}


/**
* 自定义数据适配器
*/
private class BlackNumberAdapter extends BaseAdapter {


@Override
public int getCount() {
return list.size();
}


/**
* 创建条目的界面 position 条目在listview中的索引位置 convertView 放在缓存中的view对象 parent
* 条目的父级控件listview
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {


// 1.加载条目的布局文件转换成view
View view = null;
ViewHolder viewHolder = null;
if (convertView != null) {// 如果缓存中有view对象,就直接使用它
view = convertView;
// // 得到缓存view中的holder
viewHolder = (ViewHolder) view.getTag();
System.out.println("======position==" + position
+ "===使用了缓存中有view对象==========");
} else {
view = View.inflate(BlackNumberActivity.this,
R.layout.item_black_number, null);


// 2.得到布局文件中的控件
TextView tv_number = (TextView) view
.findViewById(R.id.tv_number);
TextView tv_mode = (TextView) view.findViewById(R.id.tv_mode);
ImageView iv_delete = (ImageView) view
.findViewById(R.id.iv_delete_black_number);


// 创建一个holder记住当前view中的三个控件


viewHolder = new ViewHolder();
viewHolder.tv_number = tv_number;
viewHolder.tv_mode = tv_mode;
viewHolder.iv_delete = iv_delete;


// 把holder与view绑定到一起
view.setTag(viewHolder);


System.out.println("======position==" + position
+ "===加载布局文件==========");
}


// 3.显示数据
final BlackNumberInfo info = list.get(position);
viewHolder.tv_number.setText(info.getNumber());


String mode = info.getMode();
if ("1".equals(mode)) {
viewHolder.tv_mode.setText("电话拦截");
}
if ("2".equals(mode)) {
viewHolder.tv_mode.setText("短信拦截");
}
if ("3".equals(mode)) {
viewHolder.tv_mode.setText("电话+短信拦截");
}

viewHolder.iv_delete.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// 删除数据库中的这条记录
blackNumberDao.delete(info.getNumber());
// 从list中删除数据元素
list.remove(info);
// 刷新listview
mAdapter.notifyDataSetChanged();

}
}); 


// 4.返回view
return view;
}


@Override
public Object getItem(int arg0) {
return null;
}


@Override
public long getItemId(int arg0) {
return 0;
}
}


static class ViewHolder {
TextView tv_number;
TextView tv_mode;
ImageView iv_delete;
}

public void openAddBlackNumber(View v){
Intent intent = new Intent(this, AddBlackNumberActivity.class);
startActivityForResult(intent, 1);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1){
initData();
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值