关注RecyclerView也有一段时间了,由于种种原因一直没有自己亲自动手事件一下,首先介绍一下RecyclerView,作为替代ListView使用,RecyclerView标准化了ViewHolder,ListView中convertView是复用的,以前我们是自己写ViewHolder,Google这次将其标准化,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。总之,RecyclerView比listview更简洁了,ViewHolder更适合多种子布局的列表(现在的项目貌似都有多种子的item,比如listview中间加广告之类的)。RecyclerView不提供setOnItemClickListener方法,你可以在ViewHolder中添加事件。总之,RecyclerView比listview更简洁了
RecyclerView可以实现横向、纵向滑动视图
使用RecyclerView,必须使用指定一个adapter、定义一个布局管理器。创建adapter必须继承自RecyclerView.Adapter。实施的细节需要看数据类型和需要的视图。
RecyclerView widget
RecyclerView 提供了 LayoutManager,RecylerView 不负责子 View 的布局,我们可以自定义 LayoutManager 来实现不同的布局效果,目前只提供了LinearLayoutManager。 LinearLayoutManager 可以指定方向,默认是垂直, 可以设置成水平。
注意: 必须为RecyclerView 设置LayoutManager,否则回报空指针异常
代码中使用RecyclerView
-------------------------------------------------
首先 添加 android-support-v7-recyclerview.jar
xml布局
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" /> </RelativeLayout>
MainActivity.java
package com.zyh.testrecyclerview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; public class MainActivity extends Activity { private RecyclerView mRecyclerView; private MyRecycleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); } private void initData() { //初始化数据 List<String> list = new ArrayList<String>(); for(int i=0;i<100;i++){ list.add("我是测试条目:"+i); } //设置LayoutManager LinearLayoutManager layoutManager = new LinearLayoutManager(this); // layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //水平方向listview mRecyclerView.setLayoutManager(layoutManager ); //创建Adapter adapter = new MyRecycleAdapter(list); mRecyclerView.setAdapter(adapter); } }
MyRecycleAdapter.java
package com.zyh.testrecyclerview; import java.util.List; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MyRecycleAdapter extends RecyclerView.Adapter<MyRecycleAdapter.ViewHolder> { private List<String> list; public MyRecycleAdapter(List<String> list) { this.list = list; } @Override public int getItemCount() { return list.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mTextView.setText(list.get(position)); } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) { // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView View view = View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null); // 创建一个ViewHolder ViewHolder holder = new ViewHolder(view); return holder; } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(View itemView) { super(itemView); mTextView = (TextView) itemView; } } }