挑戰練習:刪除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); }
其他參考上面。