它取消了ListView的addHeaderView方法,所以不能像ListView那样方便的添加头部样式。
先上图说说我想实现的效果
其实就是在聊天的界面上方加入一个头部布局。头部布局里会显示聊天对象的信息。
我一开始的时候用的是 RecyclerViewHeader 这个github上的开源插件。 但是用在我的项目中有一个致命的问题 - 用户进入聊天的时候会先显示最新消息,这个时候是不需要加入头部样式的,而只用在用户手动上滑到最早信息的时候显示。但是,这个插件总是会在用户进入的时候显示头部样式,并且遮盖一部分的历史信息。
后来只能老老实实的巧用RecyclerView的Adapter,先判断是不是已经获取到了最早的信息,如果是的话,在position为0的时候,返回头部布局的view并添加头部数据。参考了 这篇文章 完成。
这个文章对RecyclerView如何加Header讲的很细致全面,不过它并没有动态添加数据到头部文件里,而我的聊天界面的头部布局需要动态添加聊天对象信息。于是我对作者的方法进行了一些修改。
如果是头部布局的话,作者的ListHolder直接返回空,因为他不需要为头部布局绑定任何数据,我会在ListHolder中获取头部布局中需要绑数据的控件,并重新onBind()方法,判断如果view是头部文件并且position为0的话,就动态添加数据。我的数据是通过重写Adapter的构造方法传过去的。
在.xml文件的design界面点击recyclerview右边的小箭头,然后点击ok即可
作用:显示是否完成拖动 *** 作
作用:在拖动时变色来显示当前状态
第三个界面要要用于显示拖动效果,所以要进行相应的修改
添加adapter依赖
将要显示的列表文本及相应功能添加进去
对拖动事件进行监听
配置拖动功能
在/res/values/styles.xml文件里,将
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
改为
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
到此,实验结束
大家都知道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条)