
recyclerview的使用方法
在activity—main中添加recyclerview控件,当然这需要提前导入compile 'com.android.support:design:23.2.1'支持包
自定义recyclerview的布局文件
这其中最重要的就自定义adapter,重写其中的三个方法,要注意要自定义一个继承自RecyclerView.ViewHolder的内部类来初始化每一个Item中的控件
在activity中初始化recyclerview以及要显示数据
定义布局manager控制滚动方向
自定义动画形势
最后给recyclerview添加adapter就ok了
RecyclerView是Google推出的一款用来显示大量数据的android控件, 是ListView,GridView等控件的优化版。它的使用非常灵活,高度的解耦,强制使用ViewHolder,性能更优。
它取消了ListView的addHeaderView方法,所以不能像ListView那样方便的添加头部样式。
先上图说说我想实现的效果
其实就是在聊天的界面上方加入一个头部布局。头部布局里会显示聊天对象的信息。
我一开始的时候用的是 RecyclerViewHeader 这个github上的开源插件。 但是用在我的项目中有一个致命的问题 - 用户进入聊天的时候会先显示最新消息,这个时候是不需要加入头部样式的,而只用在用户手动上滑到最早信息的时候显示。但是,这个插件总是会在用户进入的时候显示头部样式,并且遮盖一部分的历史信息。
后来只能老老实实的巧用RecyclerView的Adapter,先判断是不是已经获取到了最早的信息,如果是的话,在position为0的时候,返回头部布局的view并添加头部数据。参考了 这篇文章 完成。
这个文章对RecyclerView如何加Header讲的很细致全面,不过它并没有动态添加数据到头部文件里,而我的聊天界面的头部布局需要动态添加聊天对象信息。于是我对作者的方法进行了一些修改。
如果是头部布局的话,作者的ListHolder直接返回空,因为他不需要为头部布局绑定任何数据,我会在ListHolder中获取头部布局中需要绑数据的控件,并重新onBind()方法,判断如果view是头部文件并且position为0的话,就动态添加数据。我的数据是通过重写Adapter的构造方法传过去的。
大家都知道listview可以使用动态改变item布局。@Override
public int getItemViewType(int position) {
return type
}
@Override
public int getViewTypeCount() {
return number
}
当然recyclerview同样可以动态改变item布局
1、继承 RecyclerView.Adapter<RecyclerView.ViewHolder>
public class CommentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
2、重写 getItemViewType(int position)
/**
* 决定元素的布局使用哪种类型
*
* @param position 数据源的下标
* @return 一个int型标志,传递给onCreateViewHolder的第二个参数 */
@Override
public int getItemViewType(int position) {
return mDatas.get(position).getType()
}
3、在 onCreateViewHolder(ViewGroup parent, int viewType) 判断使用哪一种布局
/** * 渲染具体的ViewHolder
*
* @param parent ViewHolder的容器
* @param viewType 一个标志,我们根据该标志可以实现渲染不同类型的ViewHolder
* @return
*/
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.e("terry", "viewType = " + viewType)
View view = null
if (viewType == COMMENT_FIRST) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_main_first, parent, false)
return new CommentFirstHolder(view)
} else if (viewType == COMMENT_SECOND) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.comment_main_second, parent, false)
return new CommentSecondHolder(view)
}
return null
}
4、最后在onBindViewHolder(RecyclerView.ViewHolder holder, int position)绑定数据
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof CommentFirstHolder) {
......
} else if (holder instanceof CommentSecondHolder) {
......
}
}
5、定义对应的ViewHolder类
//第一个ViewHolder
public class CommentFirstHolder extends RecyclerView.ViewHolder {
public CommentFirstHolder(View itemView) {
super(itemView)
}
}
//第二个ViewHolder
public class CommentSecondHolder {
public CommentSecondHolder(View itemView) {
super(itemView)
}
}
这样就可以设置动态布局了,另外监听器需要自己定义回调接口,这里就不赘述了。
文/疯狂的米老鼠(简书作者)
原文链接:http://www.jianshu.com/p/9165249da2fa
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)