35、拦截黑名单、ViewHolder、对listView的优化、SQLiteOpenHelper、数据库的增删改查 listView&BaseAdapter、按钮变更(button_select)


-------------------------main.java---------------------------------


package com.example.de;


import java.util.List;


import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity {


public static final String TAG = "MainActivity";
private ListView lv_callsms_safe;
private List<BlackNumberInfo> infos;
private BlackNumberDao dao;
private CallSmsSafeAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_callsms_safe = (ListView) findViewById(R.id.lv_callsms_safe);
dao = new BlackNumberDao(this);
infos = dao.findAll();
adapter = new CallSmsSafeAdapter();
lv_callsms_safe.setAdapter(adapter);
}

private class CallSmsSafeAdapter extends BaseAdapter{
@Override
public int getCount() {
return infos.size();
}
//有多少个条目被显示,这个方法就会被调用多少次
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
//1.减少内存中view对象创建的个数
if(convertView==null){
Log.i(TAG,"创建新的view对象:"+position);
//把一个布局文件转化成  view对象。
view  = View.inflate(getApplicationContext(), R.layout.list_item_callsms, null);
//2.减少子孩子查询的次数  内存中对象的地址。
holder = new ViewHolder();
holder.tv_number = (TextView) view.findViewById(R.id.tv_black_number);
holder.tv_mode = (TextView) view.findViewById(R.id.tv_block_mode);
holder.iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
//当孩子生出来的时候找到他们的引用,存放在记事本,放在父亲的口袋
view.setTag(holder);
}else{
Log.i(TAG,"厨房有历史的view对象,复用历史缓存的view对象:"+position);
view = convertView;
holder = (ViewHolder) view.getTag();//5%
}
holder.tv_number.setText(infos.get(position).getNumber());
String mode = infos.get(position).getMode();
if("1".equals(mode)){
holder.tv_mode.setText("电话拦截");
}else if("2".equals(mode)){
holder.tv_mode.setText("短信拦截");
}else{
holder.tv_mode.setText("全部拦截");
}
holder.iv_delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new Builder(MainActivity.this);
builder.setTitle("警告");
builder.setMessage("确定要删除这条记录么?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//删除数据库的内容
dao.delete(infos.get(position).getNumber());
//更新界面。
infos.remove(position);
//通知listview数据适配器更新
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
});
return view;
}
@Override
public Object getItem(int position) {
return null;
}


@Override
public long getItemId(int position) {
return 0;
}
}
/**
* view对象的容器
*记录孩子的内存地址。
*相当于一个记事本
*/
static class ViewHolder{
TextView tv_number;
TextView tv_mode;
ImageView iv_delete;
}


private EditText et_blacknumber;
private CheckBox cb_phone;
private CheckBox cb_sms;
private Button bt_ok;
private Button bt_cancel;

public void addBlackNumber(View view){
AlertDialog.Builder builder = new Builder(this);
final AlertDialog dialog = builder.create();
View contentView = View.inflate(this, R.layout.dialog_add_blacknumber, null);
et_blacknumber = (EditText) contentView.findViewById(R.id.et_blacknumber);
cb_phone = (CheckBox) contentView.findViewById(R.id.cb_phone);
cb_sms = (CheckBox) contentView.findViewById(R.id.cb_sms);
bt_cancel = (Button) contentView.findViewById(R.id.cancel);
bt_ok = (Button) contentView.findViewById(R.id.ok);
dialog.setView(contentView, 0, 0, 0, 0);
dialog.show();
bt_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
bt_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String blacknumber = et_blacknumber.getText().toString().trim();
if(TextUtils.isEmpty(blacknumber)){
Toast.makeText(getApplicationContext(), "黑名单号码不能为空", 0).show();
return;
}
String mode ;
if(cb_phone.isChecked()&&cb_sms.isChecked()){
//全部拦截
mode = "3";
}else if(cb_phone.isChecked()){
//电话拦截
mode = "1";
}else if(cb_sms.isChecked()){
//短信拦截
mode = "2";
}else{
Toast.makeText(getApplicationContext(), "请选择拦截模式", 0).show();
return;
}
//数据被加到数据库
dao.add(blacknumber, mode);
//更新listview集合里面的内容。
BlackNumberInfo info = new BlackNumberInfo();
info.setMode(mode);
info.setNumber(blacknumber);
infos.add(0, info);
//通知listview数据适配器数据更新了。
adapter.notifyDataSetChanged();
dialog.dismiss();
}
});

}
}


-------------------------------BlackNumberDao.java--------------数据库的增删改查代码-----------------

package com.example.de;


import java.util.ArrayList;
import java.util.List;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;


/**
 * 黑名单数据库的增删改查业务类
 * @author Administrator
 *
 */
public class BlackNumberDao {
private BlackNumberDBOpenHelper helper;
/**
* 构造方法
* @param context 上下文
*/
public BlackNumberDao(Context context) {
helper = new BlackNumberDBOpenHelper(context);
}
/**
* 查询黑名单号码是是否存在
* @param number
* @return
*/
public boolean find(String number){
boolean result = false;
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from blacknumber where number=?", new String[]{number});
if(cursor.moveToNext()){
result = true;
}
cursor.close();
db.close();
return result;
}
/**
* 查询黑名单号码的拦截模式
* @param number
* @return 返回号码的拦截模式,不是黑名单号码返回null
*/
public String findMode(String number){
String result = null;
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select mode from blacknumber where number=?", new String[]{number});
if(cursor.moveToNext()){
result = cursor.getString(0);
}
cursor.close();
db.close();
return result;
}
/**
* 查询全部黑名单号码
* @return
*/
public List<BlackNumberInfo> findAll(){
List<BlackNumberInfo> result = new ArrayList<BlackNumberInfo>();
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select number,mode from blacknumber order by _id desc", null);
while(cursor.moveToNext()){
BlackNumberInfo info = new BlackNumberInfo();
String number = cursor.getString(0);
String mode = cursor.getString(1);
info.setMode(mode);
info.setNumber(number);
result.add(info);
}
cursor.close();
db.close();
return result;
}


/**
* 添加黑名单号码
* @param number 黑名单号码
* @param mode 拦截模式 1.电话拦截 2.短信拦截 3.全部拦截
*/
public void add(String number,String mode){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("number", number);
values.put("mode", mode);
db.insert("blacknumber", null, values);
db.close();
}
/**
* 修改黑名单号码的拦截模式
* @param number 要修改的黑名单号码
* @param newmode 新的拦截模式
*/
public void update(String number,String newmode){
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("mode", newmode);
db.update("blacknumber", values, "number=?", new String[]{number});
db.close();
}
/**
* 删除黑名单号码
* @param number 要删除的黑名单号码
*/
public void delete(String number){
SQLiteDatabase db = helper.getWritableDatabase();
db.delete("blacknumber",  "number=?", new String[]{number});
db.close();
}
}


------------------------BlackNumberDBOpenHelper.java---------------------


package com.example.de;


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class BlackNumberDBOpenHelper extends SQLiteOpenHelper {


/**
* 数据库创建的构造方法 数据库名称 blacknumber.db
* @param context
*/
public BlackNumberDBOpenHelper(Context context) {
super(context, "blacknumber.db", null, 1);
}
//初始化数据库的表结构
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table blacknumber (_id integer primary key autoincrement,number varchar(20),mode varchar(2))");
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


}


}


-----------------------------------BlackNumberInfo.java-------------------------


package com.example.de;


/**
 * 黑名单号码的业务bean
 * @author Administrator
 *
 */
public class BlackNumberInfo {
private String number;
private String mode;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getMode() {
return mode;
}
public void setMode(String mode) {
this.mode = mode;
}
@Override
public String toString() {
return "BlackNumberInfo [number=" + number + ", mode=" + mode + "]";
}

}


。。。。。。。。。。。main.xml。。。。。。。。。。。。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="55dip" >


        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="55dip"
            android:background="#8866ff00"
            android:gravity="center"
            android:text="黑名单拦截"
            android:textColor="#000000"
            android:textSize="22sp" />
        
        <Button 
            android:onClick="addBlackNumber"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
             android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="添加"
            />
    </RelativeLayout>


    <ListView
        android:id="@+id/lv_callsms_safe"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>


</LinearLayout>


。。。。。。。。。。。。。。。。/layout/list_item_callsms.xml。。。。。。。。。。。。。。。。。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >


    <TextView
        android:layout_marginLeft="10dip"
        android:layout_marginTop="3dip"
        android:id="@+id/tv_black_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="黑名单号码"
        android:textColor="#000000"
        android:textSize="20sp" />


    <TextView
        android:layout_marginLeft="10dip"
        android:layout_marginTop="3dip"
         android:id="@+id/tv_block_mode"
         android:layout_below="@id/tv_black_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拦截模式"
        android:textColor="#88000000"
        android:textSize="15sp" />
    
    <ImageView 
        android:id="@+id/iv_delete"
        android:layout_marginRight="3dip"
         android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/delete_selector"
        />


</RelativeLayout>

。。。。。。。。。。。。。。。。/layout/dialog_add_blacknumber.xml。。。。。。。。。。。。。。。。。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dip"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:background="#ffffff"
     >


    <TextView
        android:layout_width="300dip"
        android:layout_height="50dip"
        android:background="#66ff6600"
        android:gravity="center"
        android:text="请输入黑名单号码"
        android:textColor="#000000"
        android:textSize="22sp" />


    <EditText
        android:id="@+id/et_blacknumber"
        android:layout_width="280dip"
        android:layout_height="wrap_content"
        android:hint="请输入黑名单号码"
        android:inputType="number" />


    <LinearLayout
        android:layout_width="300dip"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >


        <CheckBox
            android:id="@+id/cb_phone"
            android:textColor="#000000"
            android:layout_width="140dip"
            android:layout_height="wrap_content"
            android:text="电话拦截" />


        <CheckBox
            android:id="@+id/cb_sms"
            android:textColor="#000000"
            android:layout_width="140dip"
            android:layout_height="wrap_content"
            android:text="短信拦截" />
    </LinearLayout>


    <LinearLayout
        android:layout_width="300dip"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >


        <Button
               android:background="@drawable/button_select"
            android:id="@+id/ok"
            android:layout_width="140dip"
            android:layout_height="wrap_content"
            android:text="确定" />


        <Button
               android:background="@drawable/button_select"
            android:id="@+id/cancel"
            android:layout_width="140dip"
            android:layout_height="wrap_content"
            android:text="取消" />
    </LinearLayout>


</LinearLayout>


..。。。。。。。。。。。。/drawable/button_select.xml。。。。。。。。。。。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/function_greenbutton_pressed" /> <!-- pressed -->
          
    <item android:state_focused="true"
          android:drawable="@drawable/function_greenbutton_pressed" /> <!-- focused -->
          
  
    <item android:drawable="@drawable/function_greenbutton_normal" /> <!-- default -->
</selector>


..。。。。。。。。。。。。/drawable/delete_selector.xml。。。。。。。。。。。


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/ic_delete_btn_focused" /> <!-- pressed -->
    <item android:state_focused="true"
          android:drawable="@drawable/ic_delete_btn_focused" /> <!-- focused -->
    <item android:state_hovered="true"
          android:drawable="@drawable/ic_delete_btn_focused" /> <!-- hovered -->
    <item android:drawable="@drawable/ic_delete_btn" /> <!-- default -->
</selector>



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值