《Android编程权威指南(第三版)》第十三章挑战练习Demo

《Android编程权威指南(第三版)》第十三章挑战练习Demo

忙了两个星期,又回来了,终于轻松一阵了,哈哈哈哈哈,有时间写了!嘚瑟一下,挑战练习走起

第一题:删除crime记录

这里直接使用List的remove(Object object)方法就行,具体怎么加工具栏的删除图标就不说了,和书上一样,直接放关键代码:

public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 告诉FragmentManager,器管理的fragment应接收onCreateOptionsMenu()方法的调用指令
         */
        setHasOptionsMenu(true);
        crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
        mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
    }

这里一定要记得在onCreate的方法里面加上setHasOptionsMenu(true)以便之后调用onCreateOptionsMenu方法

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.fragment_crime, menu);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.delete_item:
                Crime crime = CrimeLab.get(getActivity()).getCrime(crimeId);
                CrimeLab.get(getActivity()).deleteCrime(crime);
                getActivity().finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

这里设置点击事件,获得到当前item的UUID,在单例类的List里面找到对应的crime,再调用CrimeLab的delete方法删除,这个delete是我自己新加上去的,代码如下(加黑倾斜的那个):

public class CrimeLab {

    private static CrimeLab sCrimeLab;
    private List mCrimes;

    public static CrimeLab get(Context context) {
        if (sCrimeLab == null) {
            sCrimeLab = new CrimeLab(context);
        }
        return sCrimeLab;
    }

    private CrimeLab(Context context) {
        mCrimes = new ArrayList<>();
    }

    public void addCrime(Crime c) {
        mCrimes.add(c);
    }

    public void deleteCrime(Crime c) {
        mCrimes.remove(c);
    }

    public List getCrimes() {
        return mCrimes;
    }

    public Crime getCrime(UUID id) {
        for(Crime crime : mCrimes) {
            if (crime.getId().equals(id)) {
                return crime;
            }
        }
        return null;
    }

}

第一题重要的就是上面这些,下一题。

第二题:复数字符串资源

这题很奇葩,因为这本书的作者不是中国人,估计没考虑周全,把第二题的代码放上去后,当item只有一个的时候还是显示复数形式,查了一下,要把手机语言换成英文才能正常显示,第二题要注意的就只有这点

第三题:用于RecyclerView的空视图

这题我直接改了一下布局文件,然后在代码里面判断是否有值,然后显示不同的布局即可,就是通过View.VISIBLE,View.GONE来实现显示,但是题目里面说添加一个按钮方便永和直接创建新的crime记录,感觉必要不是很大,因为工具栏本身就有一个添加按钮,在加一个有点多余,当然,加一个按钮跳转到CrimePagerActivity也可以,就是逻辑上感觉说不通,所以我没加。本题主要代码如下:

private void updataSuntitle() {
        CrimeLab crimeLab = CrimeLab.get(getActivity());
        /**
         * 判断语句,判断是否有item
         */
        int crimeSize = crimeLab.getCrimes().size();
        String subtitle = getResources().getQuantityString(R.plurals.subtitle_plural, crimeSize, crimeSize);
        if (crimeSize != 0) {
            subtitle = getResources().getQuantityString(R.plurals.subtitle_plural, crimeSize, crimeSize);
            mCrimeRecyclerview.setVisibility(View.VISIBLE);
            mTextView.setVisibility(View.GONE);
        } else {
            mCrimeRecyclerview.setVisibility(View.GONE);
            mTextView.setVisibility(View.VISIBLE);
        }

        if (!mSubtitleVisible) {
            subtitle = null;
        }

        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.getSupportActionBar().setSubtitle(subtitle);
    }

三题结束,两周没写,可能有些不足之处,希望大家多多提出,谢谢 : )

源码链接:Demo

你可能感兴趣的:(Android)