挑战练习:删除crime记录  (13.6)

CriminalIntent引用目前不支持删除现有crimes记录,请为CrimeFragment添加菜单项,允许用户删除当前记录,用户点击删除菜单项后,记得调用CrimeFragment托管活动的finish方法回退到前一个activity界面.

 

 

首先为Crime增加一个菜单项。

在menu文件夹下创建一个名为crimefragment_crime的布局文件,代码如下:

<?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中添加如下代码让菜单项显示出来:

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集合中移除它。

 

之后在CrimeFragment中设置菜单项的点击事件:

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参数传入。

在我们点击CriminalIntent中的条目的时候,会执行CrimeHolder中的onClick()方法.

这个方法中的内容包含了我们需要的UUID参数。我们刚好需要的是点击条目的UUID;

修改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);
    }

 

其余参考上面。