安卓权威编程 挑战练习13.6

高斋晓开卷,独共圣人语。这篇文章主要讲述安卓权威编程 挑战练习13.6相关的知识,希望能为你提供帮助。

挑战练习:删除crime记录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 2public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 3super.onCreateOptionsMenu(menu, inflater); 4inflater.inflate(R.menu.crimefragment_crime,menu); 5}

删除crime记录,需要在存放Crime对象的List删除我们选中的条目。在CrimeLab中增加如下代码:
1public void removeCrime(UUID id){ 2Iterator< Crime> it = mCrimes.iterator(); 3while(it.hasNext()) { 4Crime crime= it.next(); 5if(crime.getId().equals(id)) { 6it.remove(); 7} 8} 9}

 
这里新增了一个removeCrime()方法,根据传入的UUID参数来找到我们选中的条目,然后在mCrimes集合中移除它。
 
之后在CrimeFragment中设置菜单项的点击事件:
1 @Override 2public boolean onOptionsItemSelected(MenuItem item) { 3 4switch (item.getItemId()) { 5case R.id.delete: 6return true; 7default: returnsuper.onOptionsItemSelected(item); 8} 9}

但是现在并没有执行具体的删除逻辑,原因是删除操作需要一个UUID参数传入。
在我们点击CriminalIntent中的条目的时候,会执行CrimeHolder中的onClick()方法.
这个方法中的内容包含了我们需要的UUID参数。我们刚好需要的是点击条目的UUID;
【安卓权威编程 挑战练习13.6】修改CrimeListFragment中的onClick()方法的代码:
1 private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 2 3...... 4 5@Override 6public void onClick(View v){ 7Intent intent = CrimePagerActivity.newIntent(getActivity(),mCrime.getId()); 8Bundle args = new Bundle(); 9args.putSerializable("crime_id",mCrime.getId()); 11CrimeListFragment listFragment = new CrimeListFragment(); 12listFragment.setArguments(args); 13startActivity(intent); 14} 15...... 16 17} 18

这里通过argument实现fragment之间的数据传输。
将所需的UUID参数存放到Bundle中。
这样就可以通过getArguments()在另外的Fragment中获取到Bundle对象 ,然后调用Bundle对象的getSerializable()方法就可以获取到所传入的UUID;
 
然后再来修改CrimeFragment中的onOptionsItemSeleted()方法。
1 @Override 2public boolean onOptionsItemSelected(MenuItem item) { 3 4switch (item.getItemId()) { 5case R.id.delete: 6 7UUID id = (UUID)getArguments().getSerializable("crime_id"); 9if(id!=null) 10CrimeLab.get(getActivity()).removeCrime(id); 11getActivity().finish(); 12return true; 13default: returnsuper.onOptionsItemSelected(item); 14} 15}

这里首先获取到UUID然后通过CrimeLab的removeCrime()方法将选中的条目删除。
最后通过getActivity().finish() 方法回退到前一个activity界面。
 

    推荐阅读