[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一切正常!那么这里才是真正地完成了两个碎片的工作呢!休息一下,下一步才是手机平板兼容的重头戏呢!

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