安卓开发学习笔记—————《第一行代码》第四章 探究碎片 (Fragment和RecyclerView实践)
项目名称:FragmentBestPratice
项目说明:一个简易版的新闻应用
RecyclerView的任务仅限于回收和定位屏幕上的View。
ViewHolder:容纳View视图。
RecyclerView需要显示视图对象时,会找它的Adapter。
1.首先会调用Adapter的getItemCount()方法,RecyclerVIew询问数组列表中包含多少个对象。
2.调用Adapter的onCreateViewHolder方法创建ViewHolder及其要显示的视图。
3.调用onBindViewHolder,Adapter会找到目标位置的数据并将其绑定到ViewHolder的视图上。
一旦有了够用的ViewHolder,RecyclerView会停止调用onCreateViewHolder,它会回收旧的ViewHolder以节约时间和内存。
RecyclerView类来自于谷歌支持库,要使用它,首先要添加RecyclerView依赖库。
碎片的生命周期
onAttach():当碎片和活动建立关联的时候调用
onCreateView():为碎片创建视图时调用。
onActivityCreate:确保与碎片相关联的活动一定已经创建完毕的时候调用。
onDestroyView:当与碎片关联的视图被移除的时候调用。
onDetach:当碎片和活动解除关联的时候调用。
使用RecyclerView关键步骤:写一个适配器,新建一个内部类NewsAdapter来作为RecyclerView的适配器。
class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> { private List<News> mNewsList; class ViewHolder extends RecyclerView.ViewHolder { TextView newsTitleText; public ViewHolder(View view) { super(view); newsTitleText=(TextView)view.findViewById(R.id.news_title); } } public NewsAdapter<List<News> newsList) { mNewsList = newsList; } }
覆写 onCreateViewHolder,onBindViewHolder,getItemCount方法,
@Override public int getItemCount() { return mNewsList.size(); }
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item,parent,false); final ViewHodler holder = new ViewHolder(view); view.setOnClickListener(...); return holder; }
@Override public void onBindViewHolder(ViewHolder holder, int position) { News new = mNewsList.get(position); holder.newsTitleText.setText(news.getTitle()); }
向RecyclerView中填充数据
public class NewsTitleFragment extends Fragment { ... @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflate.inflate(R.layout.news_title_frag,container,false); RecyclerView newsTitleRecyclerView=(RecyclerView)view.findViewById(R.id.news_title_recycler_view); LinearLayoutManager layoutManager= new LinearLayoutManager(getActivity()); newsTitleRecyclerView.setLayoutManager(layoutManager); NewsAdapter adapter = new NewsAdapter(getNews()); newsTitleRecyclerView.setAdapter(adapter); return view; } private List<News> getNews() { ... } }