1.在数据库访问dao层中,创建查询部分黑名单的方法
2.给listview设置setOnScrollListener监听事件
3. 完成监听事件内部实现 类中未实现的方法
1.在数据库访问dao层中,创建查询部分黑名单的方法
/**
* 查询部分黑名单号码
*
@param
currentNumber 从哪条记录开始
*
@param
maxNumber 最多获取多少条数据
*
@return
*/
public
List<BlackNumberBean> getPraNumberInfo(
int
currentNumber,
int
maxNumber){
try
{
Thread. sleep(600);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
List<BlackNumberBean> numberList=
new
ArrayList<BlackNumberBean>();
SQLiteDatabase db =
helper
.getWritableDatabase();
//Cursor cursor = db.rawQuery("select * from blacknumber limit ?,? ",new String[]{String.valueOf(currentNumber),String.valueOf(maxNumber)});
Cursor cursor = db.rawQuery(
"select * from blacknumber limit ? offset ?"
,
new
String[] {
String. valueOf(maxNumber), String.valueOf(currentNumber) });
while
(cursor.moveToNext()){
BlackNumberBean numberBean=
new
BlackNumberBean();
numberBean.setId(cursor.getInt(cursor.getColumnIndex(
"id"
)));
numberBean.setNumber(cursor.getString(cursor.getColumnIndex(
"number"
)));
numberBean.setMode(cursor.getString(cursor.getColumnIndex(
"mode"
)));
numberList.add(numberBean);
}
db.close();
return
numberList;
}
/**
* 查询所有黑名单个数
*
@return
*/
public
int
getMaxNumber(){
int
total=0;
SQLiteDatabase db =
helper
.getWritableDatabase();
Cursor cursor = db.rawQuery(
"select * from blacknumber"
,
null
);
total=cursor.getCount();
//得到数据库有多少条记录
db.close();
return
total;
}
-----------------------------------------------------------------------------------------------
2.给listview设置setOnScrollListener监听事件
3. 完成监听事件内部实现 类中未实现的方法
public
class
CallSmsSafeActivity
extends
Activity {
private
String
TAG
=
"CallSmsSafeActivity"
;
private
ListView
lv_callsms_safe
;
private
BlackNumberDao
dao
;
private
BlackNumberBean
blackNumberBean
;
private
List<BlackNumberBean>
numberList
;
private
TextView
tv_number
;
private
TextView
tv_mode
;
private
ImageView
iv_delete
;
private
MyAdapter
adpter
;
private
LinearLayout
loading
;
private
int
currentNumber
=0;
//分页参数
private
int
maxNumber
=20;
private
int
totalCount
;
private
boolean
loadingflag
;
/**
* 创建消息处理机制
*/
private
Handler
handler
=
new
Handler() {
@Override
public
void
handleMessage(Message msg) {
super
.handleMessage(msg);
Log. i(
TAG
,
"主线程跟新界面"
);
loading
.setVisibility(View.
GONE
);
//加载到布局时移除
if
(
adpter
==
null
){
adpter
=
new
MyAdapter();
lv_callsms_safe
.setAdapter(
adpter
);
}
else
{
//复用旧的数据适配器,通知数据适配器数据跟新了
adpter
.notifyDataSetChanged();
loadingflag
=
false
;
//标记已加载完
}
}
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_callsms_safe
);
lv_callsms_safe
=( ListView) findViewById(R.id.
lv_callsms_safe
);
loading
=(LinearLayout) findViewById(R.id.
loading
);
loading
.setVisibility(View.
VISIBLE
);
//加载布局可见
dao
=
new
BlackNumberDao(
this
);
//首次加载数据
fillDate();
totalCount
=
dao
.getMaxNumber();
Log. i(
TAG
,
"数据库总条目数:"
+
totalCount
);
//给lv 注册滚动监听事件
lv_callsms_safe
.setOnScrollListener(
new
OnScrollListener() {
// 滚动状态发生改变的时候 调用的方法
@Override
public
void
onScrollStateChanged(AbsListView view,
int
scrollState) {
switch
(scrollState) {
case
OnScrollListener.
SCROLL_STATE_IDLE
:
// listview静止状态
// 获取最后一个可见条目对应的集合里面数据的位置. 从0开始
int
lastPosition =
lv_callsms_safe
.getLastVisiblePosition();
// 获取集合的大小 从1开始
int
total =
numberList
.size();
if
(lastPosition == (total - 1)) {
Log. i(
TAG
,
"拖动到了最后一个条目,加载更多的数据..."
);
if
(
loadingflag
) {
Toast. makeText(getApplicationContext(),
"正在加载数据."
,0).show();
}
currentNumber
+=
maxNumber
;
if
(
currentNumber
>=
totalCount
) {
Toast. makeText(getApplicationContext(),
"没有更多的数据了"
,0).show();
return
;
}
fillDate();
}
break
;
cas e
OnScrollListener.
SCROLL_STATE_TOUCH_SCROLL
:
//手指触摸滚动
break
;
case
OnScrollListener.
SCROLL_STATE_FLING
:
//手指已经离开 惯性滑翔状态
break
;
}
}
//滚动的时候调用的方法
@Override
public
void
onScroll(AbsListView view,
int
firstVisibleItem,
int
visibleItemCount,
int
totalItemCount) {
}
});
}
/**
* 查询数据
*/
private
void
fillDate() {
loadingflag
=
true
;
//标记正在加载数据
new
Thread(){
public
void
run() {
//numberList=dao.getPraNumberInfo(currentPage, pageSize);
if
(
numberList
==
null
) {
numberList
=
dao
.getPraNumberInfo(
currentNumber
,
maxNumber
);
}
else
{
numberList
.addAll(
dao
.getPraNumberInfo(
currentNumber
,
maxNumber
));
}
handler
.sendEmptyMessage(0);
};
}.start();
}
/**
* 创建适配器
*/
public
class
MyAdapter
extends
BaseAdapter{
@Override
public
int
getCount() {
return
numberList
.size();
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
//复用历史缓存view对象,减少内存消耗,防止内存溢出
View view=
null
;
ViewHolder holder=
null
;
if
(convertView!=
null
&&convertView
instanceof
RelativeLayout){
//RelativeLayout:填充view的布局类型
view=convertView;
Log. i(
TAG
,
"复用历史缓存view:"
+position);
holder=(ViewHolder) view.getTag();
//复用孩子的id
}
else
{
view = View. inflate(getApplicationContext(), R.layout.
list_callsms_item
,
null
);
Log. i(
TAG
,
"创建新的view对象:"
+position);
holder=
new
ViewHolder();
//初始化view持有者
//只是在创建view的时候去寻找控件,然后把控件的id存起来
holder.
tv_number
=(TextView) view.findViewById(R.id.
tv_number
);
holder.
tv_mode
=(TextView) view.findViewById(R.id.
tv_mode
);
holder.
iv_delete
=(ImageView) view.findViewById(R.id.
iv_delete
);
view.setTag(holder);
//将holder存到view中
}
//非常消耗内存
//View view = View.inflate(getApplicationContext(), R.layout.list_callsms_item,null);
blackNumberBean
=
numberList
.get(position);
holder.
tv_number
.setText(
"号码:"
+
blackNumberBean
.getNumber());
String mode=
blackNumberBean
.getMode();
if
(
"1"
.equals(mode)){
holder.
tv_mode
.setText(
"电话拦截"
);
}
else
if
(
"2"
.equals(mode)){
holder.
tv_mode
.setText(
"短信拦截"
);
}
else
if
(
"3"
.equals(mode)){
holder.
tv_mode
.setText(
"全部拦截"
);
}
return
view;
}
@Override
public
Object getItem(
int
position) {
return
null
;
}
@Override
public
long
getItemId(
int
position) {
return
0;
}
}
/**
* 创建view持有者,将需要找的控件的应用放在 viewholder中
*/
static
class
ViewHolder{
TextView
tv_number
;
TextView
tv_mode
;
ImageView
iv_delete
;
}
}