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();
}
}
}