我在为RecyclerView添加Header时遇到的困难

我在为RecyclerView添加Header时遇到的困难,第1张

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的构造方法传过去的。

在.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

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7896063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存