[Android Exercise]Fragment新聞客戶端例子拆解PART.2—帶你記憶Fragment的使用

上一部分已經完成了 將標題和詳情頁佈局的綁定。現在進入到下一階段。


*********************************************************

繼續看看我們的圖示:



從圖上看,我們已經完成了左右兩側的佈局綁定Fragment了,感覺離完成好像不遠的樣子了呢!別高興太早,檢查一下我們注意到其實有一個地方沒有細化完成,就是左側標題碎片的RecyclerView。在上部分中我們只是簡單地在佈局文件中添加了RecyclerView,對於子項佈局、數據傳入顯示、適配器等都沒有完成。那麼現在我們就着手開始這部分。


之前都是把RecyclerView的適配器寫成一個單獨的類,但其實也可以作爲一個內部類。這樣寫的好處就是可以使用類的變量,而不需要額外編寫方法傳入需要使用的變量。
RecycleView嵌入在left_title_fragment之中,因此我們就在LeftTitleFragment之中完成Adapter:

public class LeftTitleFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_title_fragment, container, false);
        return view;
    }

    public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder>{
        List<News> newsList;
        public NewsAdapter(List<News> newsList){
            this.newsList = newsList;
        }

        class ViewHolder extends RecyclerView.ViewHolder{
            TextView title;
            View item;
            public ViewHolder(View view){
                super(view);
                item = view;
                title = (TextView)view.findViewById(R.id.text_item_title);
            }
        }
        
	@Override 
	public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.left_title_item, parent, false);
            final ViewHolder holder = new ViewHolder(view);
            holder.item.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    News news = newsList.get(holder.getAdapterPosition());
                    Toast.makeText(getActivity(), news.getTitle(), Toast.LENGTH_SHORT).show();
                }
            });
            return holder;
        }

 	@Override 
	public void onBindViewHolder(ViewHolder holder, int position) { 
	  News news = newsList.get(position); 
	  holder.title.setText(news.getTitle()); 
	} 

	@Override 
	public int getItemCount() { 
	  return newsList.size();
 	} 
    }
}


寫完這段之後,是不是發現Adapter除了換了個位置,其他的和之前單獨寫在一個類裏完全沒有變化呢!完成了適配器,寫了這麼多代碼,是不是想看看RecyclerView的效果?接下來就編寫activity_main.xml,把我們寫好的帶有RecyclerView的fragment放進一個FrameLayout中。爲什麼這裏選擇使用FrameLayout呢?因爲我們只需要在佈局中放入一個碎片,並不需要定位,因此FrameLayout就非常適用了:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/fragment_page_title"
        android:name="com.example.tahlia.newsclient_2.LeftTitleFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

※使用<fragment>標籤在佈局中添加碎片的時候,要注意指定了id之後還必須通過android:name屬性顯式指明被添加的碎片類名!


完成後,運行一次程序:



emmm。。。程序確實跑起來了,但是我們的RecyclerView呢??別緊張,我們還沒有傳入數據給RecyclerView呢,自然就沒有內容顯示啦。

在LeftTitleFragment中自定義一個方法初始化數據:

private List<News> getNews(){
        List<News> newsList = new ArrayList<>();
        for (int i = 0; i < 15; i++){
            News news = new News();
            news.setTitle("愛蓮說"+i);
            news.setContent("水陸草木之花,可愛者甚蕃。晉陶淵明獨愛菊。自李唐來,世人甚愛牡丹。予獨愛蓮之出淤泥而不染,濯清漣而不妖,中通外直,不蔓不枝,香遠益清,亭亭淨植,可遠觀而不可褻玩焉。\n" +
                    "予謂菊,花之隱逸者也;牡丹,花之富貴者也;蓮,花之君子者也。噫!菊之愛,陶後鮮有聞。蓮之愛,同予者何人?牡丹之愛,宜乎衆矣!");
            newsList.add(news);
        }
        return newsList;
    }



修改OnCreatView,獲取我們的RecyclerView控件實例,併爲它指定排布方式和適配器:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_title_fragment, container, false);
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview_title);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        NewsAdapter adapter = new NewsAdapter(getNews());
        recyclerView.setAdapter(adapter);
        return view;
    }

現在再運行一次看看效果:



啊哈,RecyclerView一切正常!那麼這裏纔是真正地完成了兩個碎片的工作呢!休息一下,下一步纔是手機平板兼容的重頭戲呢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章