运行效果如下 我们一步一步来实现
之前我们是完成了布局和sqlite建库和基本的工具类现在我们来开始写业务逻辑
来写一个MainActivity
public class MainActivity extends Activity {
private ListView mBookListView;
private EditText edtname;
private EditText edtprice;
private SimpleCursorAdapter simpleCursorAdapter;
private Cursor cursor;
private Context context;//因为要经常使用上下文 所以新建一个context
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.book_item);
context = this;
edtname = (EditText) findViewById(R.id.name_et);
edtprice = (EditText) findViewById(R.id.price_et);
mBookListView = (ListView) findViewById(android.R.id.list);
// ListView要展示批量结构化的数据1.列表项 2.初始数据 3.适配器4.监听
// 2初始数据
cursor = new DButils(this).findcursor();
// 3.游标适配器 将数据库里面的文字和数据传给控件显示出来
simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.activity_main, cursor,
new String[] { DButils.ID, DButils.NAME, DButils.PRICE, DButils.ID },
new int[] { R.id.id_tv, R.id.name_tv, R.id.price_tv, R.id.delete_tv });
// FLAG_REGISTER_CONTENT_OBSERVER :注册内容观察
mBookListView.setAdapter(simpleCursorAdapter);
// 4长按监听
mBookListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
DButils dbUtils = new DButils(context);
cursor.moveToPosition(position);
int id1 = cursor.getInt(cursor.getColumnIndex("_id"));
Toast.makeText(getApplicationContext(), "通过位置取得的" + id + "通过游标取得" + id1, Toast.LENGTH_SHORT).show();
dbUtils.delete((int) id);
//刷新操作!!!!增删都要用到
cursor.requery();
// 假如查询数据库,建议开启子线程
simpleCursorAdapter.notifyDataSetChanged();
// 发一个通知刷新,关联的listview刷新
return false;
}
});
}
// 添加记录
public void add(View v) {
DButils dButils = new DButils(context);
String name=edtname.getText().toString().trim();
String price=edtprice.getText().toString().trim();
ContentValues values=new ContentValues();
values.put(dButils.NAME, name);
values.put(dButils.PRICE, price);
dButils.save(values);
cursor.requery();
// 假如查询数据库,建议开启子线程
simpleCursorAdapter.notifyDataSetChanged();
// 发一个通知刷新,关联的listview刷新
edtname.setText("");
edtprice.setText("");
}
// 删除记录
public void delete(View v) {
TextView textView = (TextView) v;
String string = textView.getText().toString();
DButils dButils = new DButils(context);
dButils.delete(Integer.valueOf(string));
cursor.requery();
// 假如查询数据库,建议开启子线程
simpleCursorAdapter.notifyDataSetChanged();
// 发一个通知刷新,关联的listview刷新
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
System.out.println("ondestory");
if (cursor != null) {
cursor.close();
}
super.onDestroy();
}
}
逻辑很清楚,注释我也写的很明白了。就有个点要注意一下
SimpleCursorAdapter适配器是继承了CursorAdapter
继承关系如下
CursorAdapter 继承了 BaseAdapter
好处:仅加载需要显示的数据,性能好
使用方法:
1.实现两个参数构造方法
2.重写newView()方法
layout->view
3.重写bindView()方法
view.set
数据更新:
adapter.changeCursor(cursor);
adapter.notifyDataSetChanged();
我们上面的例子是使用
cursor.requery();
// 假如查询数据库,建议开启子线程
simpleCursorAdapter.notifyDataSetChanged();
// 发一个通知刷新,关联的listview刷新
来更新simpleCursorAdapter,并且传递给listview
代码如下:
public void createCursorAdapter(Cursor cursor)
{ //游标适配器,构造方法,传入cursor
mAdapter = new CursorAdapter(this, cursor)
{//重写两个方法
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{//找到布局和控件
ViewHolder holder = new ViewHolder();
LayoutInflater inflater = getLayoutInflater();
View inflate = inflater.inflate(R.layout.listview_item, null);
holder.item_tv_name = (TextView) inflate.findViewById(R.id.item_tv_name);
holder.item_tv_phone = (TextView) inflate.findViewById(R.id.item_tv_phone);
inflate.setTag(holder);
return inflate;//返回的view传给bindView。
}
@Override
public void bindView(View view, Context context, Cursor cursor)
{//复用布局。
// 把数据设置到界面上
ViewHolder holder = (ViewHolder) view.getTag();
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
holder.item_tv_name.setText(name);
holder.item_tv_phone.setText(phone);
}
};
};
再有就是那个删除标志的用法哪里要注意,把字体设置为透明。Textview的点击事件clickable设置为true。点击传text里面的id。
那个id有时候自己重写geTItemId()方法时会覆盖。这里暂且就不研究了,遇到了再说。。。看到这里,自己编一遍跑一下吧!