1. 程式人生 > >Android五天樂(第三天)ListFragment與ViewPager

Android五天樂(第三天)ListFragment與ViewPager

viewgroup cat () wid group 得到 ica bottom csdn

1ListFragment

今天首先學習了一種很經常使用的展示場景:列表展示。

昨天學習了使用Fragmet來取代activity進行設計。今天在托管單個fragment的基礎上,掌握托管一個布局list。先看下效果: 技術分享

由於Fragment列表須要使用ArrayList保存。而為了使Fragment對象受acrivity等生命周期影響, 創建例如以下單例類:

public class CrimeLab {

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

    }
    public static CrimeLab get(Context c){
        if(sCrimeLab==null){
            sCrimeLab=new CrimeLab(c.getApplicationContext());
        }
        return sCrimeLab;
    }
    public ArrayList<Crime> getmCrimes(){
        return mCrimes;
    }
    public Crime getCrime(UUID id){
        for (Crime c: mCrimes){
            if(c.getId().equals(id)){
                return c;
            }
        }
        return null;
    }
}

同一時候,還要建立對應的fragment布局文件和類文件。實際上,存在專門支持list fragment的類:ListFragment。繼承這個類就可以。之後可使用其內置的listadapter。

為什麽使用adapter呢? 由於我們的fragmentlab中新建了100個fragment對象,而我們不可能在一個頁面中把他們所有顯示出來。而是須要顯示時才創建對象。

adapter就是從模型層獲得數據。並把它提供給ListView顯示的橋梁。

private class CrimeAdapter extends ArrayAdapter<Crime>{
                public CrimeAdapter(ArrayList<Crime> crimes){
                    super(getActivity(),0,crimes);
                }
                @Override
                public View getView(int position,View convertView,ViewGroup parent){

                    if(convertView==null){
                        convertView=getActivity().getLayoutInflater().inflate(R.layout.list_item_crime,null);
                    }

                    Crime c=getItem(position);
                    TextView titleTextView=(TextView)convertView.findViewById(R.id.crime_list_item_titleTextView);
                    titleTextView.setText(c.getTitle());
                    TextView dateTextView=(TextView)convertView.findViewById(R.id.crime_list_item_dateTextView);
                    dateTextView.setText(c.getDate().toString());
                    CheckBox solvedCheckBox=(CheckBox)convertView.findViewById(R.id.crime_list_item_solvedCheckBox);
                    solvedCheckBox.setChecked(c.isSolved());

                    return convertView;

        }
    }

實現自己定制Adapater的代碼。之所以要實現自己的adapter,是由於在list的每個條目我們定制了自己的布局。

如代碼中的list_item_crime.

這樣就得到了list顯示的fragment。

2ViewPager

ViewPager能夠實現左右滑動屏幕切換查看不同列表項的功能。

ViewPager須要借助於Adapter才可以提供視圖。

通過PagerAdapter的子類:FragmentStatePagerAdapter來處理兩者間的配合問題。

這裏須要實現兩個方法,getCount()和getItem()。

代碼示比例如以下:

mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {

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

        });




3 fragment傳輸數據

跟activity類似。fragment間也能夠進行傳輸數據。並且fragment級的傳輸數據會使編程更加靈活。

試想例如以下場景: 在CrimeFragment中須要按鍵調出DatePickerFragment, 後者的初始化須要前者提供的數據。同一時候,DatePickerFragment的返回值也要作用於CrimeFragment。

須要做的事情有例如以下幾步:

1)從CrimeFragment 初始化DatePickerFragment時, 將數據作為構造參數傳入

2)DatePickerFragment構造時。將傳入的值保存到argument

3)DatePickerFragment渲染時,取arguments中值

4)DatePickerFragment將值回傳給CrimeFragment

為實現以上過程,首先要在DatePickerFragment 編寫newInstance方法, 改方法能夠在實例化DatePickerFragment時被調用並接受參數。同一時候在fragment create前準備好數據

public static DatePickerFragment newInstance(Date date){
        Bundle args=new Bundle();
        args.putSerializable(EXTRA_DATE,date);
        DatePickerFragment fragment=new DatePickerFragment();
        fragment.setArguments(args);

        return fragment;
    }


返回數據時,則覆蓋onActivityResult方法。

交互過程如: 技術分享

Android五天樂(第三天)ListFragment與ViewPager