安卓權威編程指南 挑戰練習13.6 14.8

挑戰練習:刪除crime記錄  (13.6)

CriminalIntent引用目前不支持刪除現有crimes記錄,請爲CrimeFragment添加菜單項,容許用戶刪除當前記錄,用戶點擊刪除菜單項後,記得調用CrimeFragment託管活動的finish方法回退到前一個activity界面.

 

 

首先爲Crime增長一個菜單項。android

在menu文件夾下建立一個名爲crimefragment_crime的佈局文件,代碼以下:app

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/delete"
        android:title="delete"
        app:showAsAction="ifRoom"/>
</menu>

以後在CrimeFragment中添加以下代碼讓菜單項顯示出來:ide

1  @Override
2     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
3         super.onCreateOptionsMenu(menu, inflater);
4         inflater.inflate(R.menu.crimefragment_crime,menu);
5     }

刪除crime記錄,須要在存放Crime對象的List刪除咱們選中的條目。在CrimeLab中增長以下代碼:佈局

1     public void removeCrime(UUID id){
2         Iterator<Crime> it = mCrimes.iterator();
3         while(it.hasNext()) {
4             Crime crime  = it.next();
5             if(crime.getId().equals(id)) {
6                 it.remove();
7             }
8         }
9     }

 

這裏新增了一個removeCrime()方法,根據傳入的UUID參數來找到咱們選中的條目,而後在mCrimes集合中移除它。spa

 

以後在CrimeFragment中設置菜單項的點擊事件:code

1 @Override
2     public boolean onOptionsItemSelected(MenuItem item) {
3 
4         switch (item.getItemId()) {
5             case R.id.delete:
6                 return true;
7             default: return  super.onOptionsItemSelected(item);
8         }
9     }

可是如今並無執行具體的刪除邏輯,緣由是刪除操做須要一個UUID參數傳入。xml

在咱們點擊CriminalIntent中的條目的時候,會執行CrimeHolder中的onClick()方法.對象

這個方法中的內容包含了咱們須要的UUID參數。咱們恰好須要的是點擊條目的UUID;blog

修改CrimeListFragment中的onClick()方法的代碼:事件

 1 private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
 2 
 3          ......
 4       
 5         @Override
 6         public void onClick(View v){
 7             Intent intent = CrimePagerActivity.newIntent(getActivity(),mCrime.getId());
 8             Bundle args = new Bundle(); 9 args.putSerializable("crime_id",mCrime.getId()); 11 CrimeListFragment listFragment = new CrimeListFragment(); 12 listFragment.setArguments(args); 13             startActivity(intent);
14         }
15       ......
16     
17     }
18         

這裏經過argument實現fragment之間的數據傳輸。

將所需的UUID參數存放到Bundle中。

這樣就能夠經過getArguments()在另外的Fragment中獲取到Bundle對象 ,而後調用Bundle對象的getSerializable()方法就能夠獲取到所傳入的UUID;

 

而後再來修改CrimeFragment中的onOptionsItemSeleted()方法。

 1 @Override
 2     public boolean onOptionsItemSelected(MenuItem item) {
 3 
 4         switch (item.getItemId()) {
 5             case R.id.delete:
 6 
 7                 UUID id = (UUID)getArguments().getSerializable("crime_id"); 9 if(id!=null) 10 CrimeLab.get(getActivity()).removeCrime(id); 11 getActivity().finish(); 12                 return true;
13             default: return  super.onOptionsItemSelected(item);
14         }
15     }

這裏首先獲取到UUID而後經過CrimeLab的removeCrime()方法將選中的條目刪除。

最後經過getActivity().finish() 方法回退到前一個activity界面。


 

 

14.8挑戰練習:刪除Crime記錄

只須要修改CrimeLab中的刪除方法,改成刪除表中的數據便可。

 public void deleteCrimes(String whereClause, String[] whereArgs){
        mDatabase.delete(CrimeTable.NAME,whereClause,whereArgs);
    }

 

其他參考上面。

相關文章
相關標籤/搜索