CriminalIntent項(xiàng)目總結(jié)

  • UI fragment管理器
  • 升級CriminalIntent應(yīng)用的模型層
  • 使用fragment argument
  • 使用ViewPager左右滑動屏幕

UI fragment管理器

用fragment來滿足UI設(shè)計的靈活性需求

由于Android系統(tǒng)對activity使用有所限制,所以我們用fragment來代替activity管理用戶界面UI。fragment是一種控制器對象,管理應(yīng)用UI的fragment的又稱之為UI fragment。fragment自己會產(chǎn)生布局文件的視圖,activity視圖會提供fragment視圖插入。本項(xiàng)目我們將會用activity和fragment組裝或重組用戶界面。


UUID——Android框架里的java工具類

UUID便于我們產(chǎn)生唯一ID值,在構(gòu)造方法里,可以調(diào)用UUID.randomUUID()產(chǎn)生一個隨機(jī)唯一ID值。


Activty托管fragment的兩種方式

1.在activity布局中添加fragment

使用布局fragment,簡單但很局限,不能替換fragment視圖.

2.在activity代碼中添加fragment

復(fù)雜但卻是唯一可以動態(tài)控制fragment的方式,本次項(xiàng)目中就是用的這一方法。

創(chuàng)建Fragment類

但是在修改繼承類的時候,Android Studio會找到兩個同名類。前者是Fragment(android.app)操作系統(tǒng)內(nèi)置版,后者是Fragment(android.support.v4.app)支持庫版這里我們需要的是支持庫版Fragment。

升級CriminalIntent應(yīng)用的模型層

從容納單個Crime對象變?yōu)榭扇菁{一組Crime對象

創(chuàng)建可容納Crime對象的List

private List<Crime> mCrimes;

private CrimeLab(Context context) {
        mCrimes = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Crime crime = new Crime();
            crime.setTitle("Crime #" + i);
            crime.setSolved(i % 2 == 0);
            mCrimes.add(crime);
        }
    }

    public List<Crime> getCrimes() {
        return mCrimes;
    }

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

        return null;
    }

RecyclerView 、ViewHolder和Adapter

RecyclcerView的任務(wù)就是回收和定位屏幕上的列表View,View要能顯示數(shù)據(jù),需要ViewHolderAdapter的支持。ViewHolder的作用是容納View視圖。Adapter是一個控制器對象,從模型層獲取對象,然后提供給RecyclerView顯示。

綁定列表項(xiàng)

讓java代碼(Crime里的模型數(shù)據(jù),或點(diǎn)擊監(jiān)聽器)和組件關(guān)聯(lián)起來。

    private TextView mTitleTextView;
    private TextView mDateTextView;
    private Crime mCrime;
    
    public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.list_item_crime, parent, false));
            itemView.setOnClickListener(this);

            **mTitleTextView =(TextView)itemView.findViewById(R.id.crime_title);
            mDateTextView = (TextView) itemView.findViewById(R.id.crime_date);**
        }
        
    public void bind(Crime crime) {
            mCrime = crime;
            mTitleTextView.setText(mCrime.getTitle());
            mDateTextView.setText(mCrime.getDate().toString());
            mSolvedImageView.setVisibility(crime.isSolved() ? View.VISIBLE : View.GONE);
        }
        
    @Override
        public void onBindViewHolder(CrimeHolder holder, int position) {
            Crime crime = mCrimes.get(position);
            holder.bind(crime);
        }
    
        

使用fragment argument

附加argument給fragment

添加名為newInstance()的靜態(tài)方法給fragment類。使用該方法完成fragment實(shí)例及Dundle對象的創(chuàng)建。

編寫newInstance(UUID)方法

private static final String ARG_CRIME_ID = "crime_id";

public static CrimeFragment newInstance(UUID crimeId) {
        Bundle args = new Bundle();
        args.putSerializable(ARG_CRIME_ID, crimeId);

        CrimeFragment fragment = new CrimeFragment();
        fragment.setArguments(args);
        return fragment;
}

獲取argument

 UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);

刷新顯示列表項(xiàng)

onResume()方法中刷新列表項(xiàng)

@Override
    public void onResume(){
        super.onResume();
        updateUI();
    }

使用ViewPager左右滑動屏幕

創(chuàng)建CrimePagerAcitivity

    private ViewPager mViewPager;
    private List<Crime> mCrimes;
    
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crime_pager);

        UUID crimeId = (UUID) getIntent()
                .getSerializableExtra(EXTRA_CRIME_ID);

        mViewPager = (ViewPager) findViewById(R.id.crime_view_pager);

        mCrimes = CrimeLab.get(this).getCrimes();
        FragmentManager fragmentManager = getSupportFragmentManager();
        mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {

            @Override
            public Fragment getItem(int position) {
                Crime crime = mCrimes.get(position);
                return CrimeFragment.newInstance(crime.getId());
            }

            @Override
            public int getCount() {
                return mCrimes.size();
            }
        });
    }

FragmentStatePagerAdapterFragmentPagerAdapter的區(qū)別

在卸載不需要的fragment時,FragmentStatePagerAdapter會徹底銷毀其,而FragmentPagerAdapter會調(diào)用事務(wù)的detach(Fragment)方法來處理他,fragment的實(shí)例還保留在FragmentManager中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容