使用RecycleView的好处
从Android5.0开始,google给我们带来了一个全新的列表组件,叫做RecycleView。使得apk几乎已经抛弃了ListView,之所以RecycleView那么强大,总结的主要原因有如下几点:
1、提供ViewHolder模式,使得开发者真正操作的是ViewHolder,而不是像ListView中的getView,需要开发者自己setTag和view.getTag
2、同时支持列表布局和网格布局,而ListView只能支持列表布局,网格布局需要用GridView。
3、支持瀑布流布局。我们不在需要为实现瀑布流效果而苦恼
4、操作动画。在对列表进行增加、删除时的动画。并且Adapter提供了增加删除某个item的方法
5、性能与拓展性。RecycleView听起来像是回收的view,事实上,RecycleView本身就不关心View相关的显示、View显示什么内容(ViewHolder来管理),View怎么摆放(LayoutManager来管理),也不关心动画(ItemAmator来管理),甚至连分割线它都不管(由ItemDecoration来管理)
而它关心View的回收复用,这跟性能有关系。所以名字用Recycle也是有道理的。这样的好处是,把各个环节工作交付给了不同的类,类似“插件化”。特别方便拓展,自定义各种各样的差异化,而从这其中解耦出来
RecycleView的基本用法
RecycleView并没有集成在SDK中,而是放在了v7包里面,我们添加它的依赖:
implementation 'com.android.support:recyclerview-v7:27.1.1'
在布局中添加RecycleView:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
//LinearLayoutManager是用来做列表布局,也就是单列的列表
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
rv.setLayoutManager(layoutManager);
//默认就是垂直方向的
((LinearLayoutManager) layoutManager).setOrientation(OrientationHelper.VERTICAL);
//谷歌提供了一个默认的item删除添加的动画
rv.setItemAnimator(new DefaultItemAnimator());
//谷歌提供了一个DividerItemDecoration的实现类来实现分割线
//往往我们需要自定义分割线的效果,需要自己实现ItemDecoration接口
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
rv.addItemDecoration(dividerItemDecoration);
//当item改变不会重新计算item的宽高
//调用adapter的增删改差方法的时候就不会重新计算,但是调用nofityDataSetChange的时候还是会
//所以往往是直接先设置这个为true,当需要布局重新计算宽高的时候才调用nofityDataSetChange
rv.setHasFixedSize(true);
//模拟列表数据
newsList = new ArrayList<>();
News news;
for (int i = 1; i < 100; i++) {
news = new News();
news.title = "新闻标题内容新闻标题内容新闻标题内容新闻标题内容新闻标题内容";
news.source = "腾讯新闻" ;
news.time = "2019-01-17";
newsList.add(news);
}
设置适配器
NewsAdapter newsAdapter = new NewsAdapter(newsList);
rv.setAdapter(new NormalAdapterWrapper(newsAdapter));
接下来编写NewsAdapter的代码,它需要实现 RecyclerView.Adapter<RecyclerView.ViewHolder>
public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<News> list;
public NewsAdapter(List<News> list) {
this.list = list;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = null;
v = getLayoutInflater().inflate(R.layout.item, null, false);
RecyclerView.ViewHolder holder = null;
holder = new MyViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
((MyViewHolder) holder).title.setText(list.get(position).title);
((MyViewHolder) holder).time.setText(list.get(pos