安卓开发学习笔记—————《第一行代码》第四章 探究碎片 (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() {
  ...
 }
}

 

posted @ 2018-10-23 23:00  kyun  阅读(371)  评论(0编辑  收藏  举报