比赛结束后,我看了一下程式,才发现,没有写到删除的功能,这样,就不够完整。所以,这个章节,就来将最后一个功能,删除完成。所以,此功能,执行的方式为,在ListView,如果长时间按着某一个项目,就会出现是否确定要删除的讯息,再确定是否要删除此资料。不过,如果要开发此功能,就要重新更新列表的程式架构。而且,删除此资料后,要重新整理列表的资料,测试了不少方式,发现用执行绪来重新整理是比较好的方式。先看一下,完整的程式码:
public class frm_cust_list extends AppCompatActivity implements ListView.OnItemClickListener,ListView.OnItemLongClickListener { //宣告物件 private SQLiteDatabase db = null; private Cursor cursor = null; private SimpleCursorAdapter adapter = null; ListView lsv_cust; private String strid = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_frm_cust_list); lsv_cust = (ListView)findViewById(R.id.lsvcust); lsv_cust.setOnItemClickListener(this); lsv_cust.setOnItemLongClickListener(this); //建立SQLite 资料库的实体档案 db = openOrCreateDatabase("cust.db", Context.MODE_PRIVATE,null); //建立资料表的SQL语法 String strcreatedb = "CREATE TABLE IF NOT EXISTS " + "tcustomer (_id INTEGER PRIMARY KEY, cname TEXT, ctel TEXT) "; //执行SQL语法,建立资料表 db.execSQL(strcreatedb); //查询资料 cursor = db.rawQuery("SELECT * FROM tcustomer",null); //如果查询有资料的话,就跟ListView做连结 if (cursor != null && cursor.getCount() >=0) { adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, new String[] {"_id","cname"}, new int[] {android.R.id.text1,android.R.id.text2}, 0); lsv_cust.setAdapter(adapter); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //取得按下ListView的那个Item的值。 TextView txtid = (TextView) view.findViewById(android.R.id.text1); //prc_showmessage("id:" + txtid.getText().toString() + " " ); //按下Item时,要呼叫编辑的Activity,利用Intent物件带参数过去。 Intent it = new Intent(); it= new Intent(this,frm_cust_edit.class); it.putExtra("pid",txtid.getText().toString()); startActivity(it); //关闭本身的Activity。 this.finish(); } public void prc_btnadd(View v) { //按下新增时,要呼叫新增的Activity,利用Intent物件。 Intent it = new Intent(); it= new Intent(this,frm_cust_add.class); startActivity(it); //关闭本身的Activity。 this.finish(); } //显示讯息 public void prc_showmessage(String strmessage) { Toast objtoast = Toast.makeText(this,strmessage, Toast.LENGTH_SHORT); objtoast.show(); } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { //取得按下ListView的那个Item的值。 TextView txtid = (TextView) view.findViewById(android.R.id.text1); strid = txtid.getText().toString(); new AlertDialog.Builder(this) .setTitle("删除资料") .setMessage("您确定要删除资料?") .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String strupdatesql = "DELETE from tcustomer WHERE _id=" + strid; db.execSQL(strupdatesql); //透过执行绪,更新ListView的资料。 new RefreshList().execute(); } }) .setNegativeButton("否", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); //要设定成true,才不会触发到onitemclick return true; } private class RefreshList extends AsyncTask<Void,Void,Cursor> { //通过执行绪AsyncTask来读取资料库,再更新Cursor。 @Override protected Cursor doInBackground(Void... voids) { //在执行绪中,重新取得资料库的资料,再回传新的Cursor。 Cursor newCurosr = db.rawQuery("SELECT * FROM tcustomer",null); return newCurosr; } protected void onPostExecute(Cursor newCursor) { //更新Cursor,再关才原来的Curosr。 adapter.changeCursor(newCursor); cursor.close(); cursor = newCursor; } }}
执行出来的列表画面,如下图所示:
在列表资料,如果长时间按着某一个项目,就会出现是否确定要删除的讯息,再确定是否要删除此资料。按下「是」,就会直接删除此资料,再重新整理列表资料。
重新整理的列表资料:
终于写好了,比赛后的第一篇文章。后续,预计将要重新整理我之前写的记帐系统的需求分析、系统分析、系统设计、撰写程式、封装上市。这次会再简化、依新版的Android,重新设计介面及撰写程式等步骤。