Google在推出Android5.0的时候推出了Material Design ,而RecyclerView是Material Design 重要组件之一。当然还有CardView/Palette。
RecyclerView是用来替换传统的ListView和GridView,瀑布流效果的。是的RecyclerView这一个控件,可以实现这三个效果。虽然在开始使用recyclerview的时候会感到有些男,但是用熟练了会发现recyclerview十分强大。它可以给每一item里面的控件设置点击时间,而不需要担心事件冲突的问题,如果是使用listview或者是gridview就必须要解决事件冲突,甚至listview或gridview的item只能设置一个点击事件,否则就会造成事件冲突,而这些冲突并不好解决。所以recyclerview来了。
首先在项目中集成RecyclerView,在build.gradle添加RecyclerView的依赖
这样项目中就集成 recyclerview了,Android Studio 会自动联网下载 recyclerview包。
在activity_main.xml中,使用recyclerview.
<code><</code><code>android.support.v7.widget.RecyclerView</code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/recyclerView"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"match_parent"</code> <code>/></code>
布局中已经有了recyclerview的控件,下面就开始在代码中编写。
在这里解释一下recyclerview的使用。就像listview那样,recyclerview也需要一个适配器;在我们优化listview的时候,我们经常会使用到一个内部类ViewHolder来保存item中的控件,以便于item的复用。而现在recyclerview则必须使用ViewHolder。这个ViewHolder必须继承RecyclerView.ViewHolder,RecyclerView.ViewHolder有一个参数的构造方法,传入的是一个view,这个view 就是recyclerview的item。
RecyclerViewHolder:
<code>public</code> <code>class</code> <code>RecyclerViewHolder </code><code>extends</code> <code>RecyclerView.ViewHolder {</code>
<code> </code><code>public</code> <code>TextView textView;</code>
<code> </code><code>public</code> <code>ImageView imageView;</code>
<code> </code><code>public</code> <code>RecyclerViewHolder(View itemView) {</code>
<code> </code><code>super</code><code>(itemView);</code>
<code> </code><code>textView = (TextView) itemView.findViewById(R.id.textView);</code>
<code> </code><code>imageView = (ImageView) itemView.findViewById(R.id.imageView);</code>
<code> </code><code>}</code>
<code>}</code>
RecyclerViewHolder写好之后就开始写Adapter.同样RecyclerAdapter需要继承RecyclerView.Adapter<RecyclerViewHolder>,泛型ViewHolder就是自己自定义的RecyclerViewHolder。Adapter的写法如下:
<code>public</code> <code>class</code> <code>RecyclerAdapter </code><code>extends</code> <code>RecyclerView.Adapter<RecyclerViewHolder> {</code>
<code> </code><code>private</code> <code>List<Map<String, String>> dataList;</code>
<code> </code><code>public</code> <code>RecyclerAdapter() {</code>
<code> </code><code>dataList = </code><code>new</code> <code>ArrayList<>();</code>
<code> </code><code>public</code> <code>void</code> <code>addAll(List<Map<String, String>> data){</code>
<code> </code><code>dataList.addAll(data);</code>
<code> </code><code>/**</code>
<code> </code><code>*</code>
<code> </code><code>* @param viewType 对应的是getItemViewType(int position)方法返回的数值</code>
<code> </code><code>*/</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>RecyclerViewHolder onCreateViewHolder(ViewGroup parent, </code><code>int</code> <code>viewType) {</code>
<code> </code><code>View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, </code><code>false</code><code>);</code>
<code> </code><code>return</code> <code>new</code> <code>RecyclerViewHolder(view);</code>
<code> </code><code>* @param holder 对应的是onCreateViewHolder方法,返回的RecyclerViewHolder</code>
<code> </code><code>* @param position 当前的item的位置</code>
<code> </code><code>public</code> <code>void</code> <code>onBindViewHolder(RecyclerViewHolder holder, </code><code>int</code> <code>position) {</code>
<code> </code><code>holder.textView.setText(dataList.get(position).get(</code><code>"data"</code><code>));</code>
<code> </code><code>public</code> <code>int</code> <code>getItemCount() {</code>
<code> </code><code>return</code> <code>dataList.size();</code>
MainActivity中的代码。
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>AppCompatActivity {</code>
<code> </code><code>private</code> <code>RecyclerView recyclerView;</code>
<code> </code><code>//使用线性布局管理器,设置的方向orientation是默认,即垂直方向</code>
<code> </code><code>private</code> <code>LinearLayoutManager manager;</code>
<code> </code><code>//适配器</code>
<code> </code><code>private</code> <code>RecyclerAdapter adapter;</code>
<code> </code><code>//数据源</code>
<code> </code><code>private</code> <code>List<Map<String, String>> list;</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.activity_main);</code>
<code> </code><code>recyclerView = (RecyclerView) findViewById(R.id.recyclerView);</code>
<code> </code><code>manager = </code><code>new</code> <code>LinearLayoutManager(</code><code>this</code><code>);</code>
<code> </code><code>adapter = </code><code>new</code> <code>RecyclerAdapter();</code>
<code> </code><code>//设置布局管理器</code>
<code> </code><code>recyclerView.setLayoutManager(manager);</code>
<code> </code><code>//给recyclerview设置适配器</code>
<code> </code><code>recyclerView.setAdapter(adapter);</code>
<code> </code><code>list = </code><code>new</code> <code>ArrayList<>();</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<</code><code>50</code><code>;i++)</code>
<code> </code><code>{</code>
<code> </code><code>Map<String,String> map = </code><code>new</code> <code>HashMap<>();</code>
<code> </code><code>map.put(</code><code>"data"</code><code>, </code><code>"item--> "</code><code>+i);</code>
<code> </code><code>list.add(map);</code>
<code> </code><code>}</code>
<code> </code><code>adapter.addAll(list);</code>
<code> </code><code>adapter.notifyDataSetChanged();</code>
recyclerview实现listview的效果就完成了,运行效果:
<a href="http://s3.51cto.com/wyfs02/M00/7D/CB/wKiom1bwAm6gFtn-AACorefEJoQ425.png" target="_blank"></a>
如果是想每个item横向滑动的话,只需要使用LinearLayoutManager的三个参数的构造方法就行了,new LInearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true)就可以实现横向滑动的效果了。
recyclerView实现GridView的效果。需要是用是GridLayoutManager。将recyclerView的布局管理器更换成GridLayoutManager manager = new GridLayoutManager(this, 2),效果图如下:
<a href="http://s5.51cto.com/wyfs02/M02/7D/CB/wKiom1bwBiXzf2LxAADEl4akjZo408.png" target="_blank"></a>
给RecyclerView添加滚动监听。与listView和gridView有写不同,recyclerView判断滚动到哪一个位置的饿时候,需要使用到使用到布局管理器(前面设置的recyclerview.setLayoutManager())。滚动监听的方法有两个,setOnScrollListener(已不推荐使用)和addOnScrollListener。两个方法本质上是一致的。代码如下:
<code>recyclerView_follow.addOnScrollListener(</code><code>new</code> <code>RecyclerView.OnScrollListener() {</code>
<code> </code><code>public</code> <code>void</code> <code>onScrollStateChanged(RecyclerView recyclerView, </code><code>int</code> <code>newState) {</code>
<code> </code><code>super</code><code>.onScrollStateChanged(recyclerView, newState);</code>
<code> </code><code>//滚动的状态改变时,调用此方法。</code>
<code> </code><code>public</code> <code>void</code> <code>onScrolled(RecyclerView recyclerView, </code><code>int</code> <code>dx, </code><code>int</code> <code>dy) {</code>
<code> </code><code>super</code><code>.onScrolled(recyclerView, dx, dy);</code>
<code> </code><code>//屏幕中最下面一个item的所在数据源的位置(postion)。</code>
<code> </code><code>int</code> <code>lastVisiableItem = manager.findLastVisibleItemPosition();</code>
<code> </code><code>//一共有多少个</code>
<code> </code><code>int</code> <code>totalItemCount = manager.getItemCount();</code>
<code> </code><code>//当滑动到倒数第二个item时,即联网获取下一页的数据</code>
<code> </code><code>if</code> <code>(lastVisiableItem >= totalItemCount - </code><code>2</code> <code>&& dy > </code><code>0</code><code>) {</code>
<code> </code><code>page++;</code><code>//第二页</code>
<code> </code><code>reloadData(page);</code>
<code>});</code>
给RecyclerView添加监听事件:
首先在Adapter中的onBindViewHolder方法中设置点击事件,使用holder.xxx.setOnClickListener()设置点击事件.RecyclerView避免了事件的冲突问题,可以给每个item中的控件设置点击事件.
本文转自 墨宇hz 51CTO博客,原文链接:http://blog.51cto.com/zzhhz/1753676