1.点击添加按钮显示自定义对话框布局
2.给自定义对话框中控件设置点击事件
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
;
//标记已加载完
}
}
};
/**
* Activity创建时
*/
@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
;
case
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(
final
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(
"全部拦截"
);
}
//给删除图标注册点击事件
holder.
iv_delete
.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
Log. i(
TAG
,
"删除号码:"
+
blackNumberBean
.getNumber());
dao
.delete(
blackNumberBean
.getNumber());
numberList
.remove(position);
//集合中移除listview对应的条目
adpter
.notifyDataSetChanged();
//刷新界面
}
});
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
;
}
private
EditText
et_blacknumber
;
private
RadioGroup
gr_mode
;
private
Button
bt_ok
;
private
Button
bt_cancle
;
/**
* 添加按钮触发的点击事件
*/
public
void
addBlackNumber(View view){
AlertDialog.Builder builder=
new
Builder(
this
);
//创建对话框建设者
final
AlertDialog dialog = builder.create();
//创建对话框
//将自定义对话框布局填充到对话框上
View contentView=View. inflate(
this
, R.layout.
dialog_enter_blacknumber
,
null
);
et_blacknumber
=(EditText) contentView.findViewById(R.id.
et_blacknumber
);
gr_mode
=(RadioGroup) contentView.findViewById(R.id.
radioGroup1
);
bt_ok
=(Button) contentView.findViewById(R.id.
bt_ok
);
bt_cancle
=(Button) contentView.findViewById(R.id.
bt_cancle
);
//给取消按钮设置点击事件
bt_cancle
.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
Log. i(
TAG
,
"取消对话框"
);
dialog.dismiss();
}
});
//给确定按钮选择点击事件
bt_ok
.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
String et_number=
et_blacknumber
.getText().toString().trim();
if
(TextUtils. isEmpty(et_number)){
Toast. makeText(getApplicationContext(),
"输入的号码不能为空"
, 0).show();
return
;
}
if
(
dao
.find(et_number)){
//如果输入的号码已经存在
Toast. makeText(getApplicationContext(),
"输入的号码已经在黑名单中"
, 0).show();
return
;
}
//判断选择的模式
String mode=
"3"
;
switch
(
gr_mode
.getCheckedRad ioButtonId()) {
case
R.id.
rb_phone
:
// 1. 电话拦截
mode=
"1"
;
break
;
case
R.id.
rb_sms
:
// 2. 短信拦截
mode=
"2"
;
break
;
case
R.id.
rb_all
:
// 3. 全部拦截
mode=
"3"
;
break
;
}
//添加黑名单号吗
dao
.add(et_number,mode);
//将新添加的黑名单号码添加到集合中,显示到界面上 最上面一个条目
numberList
.add(0,
new
BlackNumberBean(0, et_number, mode));
adpter
.notifyDataSetChanged();
// 刷新界面
dialog.dismiss();
}
});
dialog.setView(contentView, 0, 0, 0, 0);
dialog.show();
}
}