- 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ù),需要ViewHolder和Adapter的支持。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();
}
});
}
FragmentStatePagerAdapter與FragmentPagerAdapter的區(qū)別
在卸載不需要的fragment時,
FragmentStatePagerAdapter會徹底銷毀其,而FragmentPagerAdapter會調(diào)用事務(wù)的detach(Fragment)方法來處理他,fragment的實(shí)例還保留在FragmentManager中。