• 安卓权威编程指南 挑战练习13.6 14.8


    挑战练习:删除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);
        }

    其余参考上面。

  • 相关阅读:
    Json对象和字符串互转
    JSNOP调用。。。
    org.hibernate.LazyInitializationException: could not initialize proxy no Session
    myeclipse生成注解实体
    jquery判断浏览器和版本
    JSTL XML标签库
    ORACLE 月份不全,补全月份的sql
    js 上下左右键控制焦点
    google gson使用
    js判断undefined类型
  • 原文地址:https://www.cnblogs.com/chase1/p/7182389.html
Copyright © 2020-2023  润新知