安卓权威编程指南 挑战练习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);
    }

 

其他参考上面。

相关文章
相关标签/搜索