上一部分已經完成了 將標題和詳情頁佈局的綁定。現在進入到下一階段。
*********************************************************
繼續看看我們的圖示:
從圖上看,我們已經完成了左右兩側的佈局綁定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一切正常!那麼這裏纔是真正地完成了兩個碎片的工作呢!休息一下,下一步纔是手機平板兼容的重頭戲呢!