好吧,别看标题就跑了。我知道 ListView 嵌套 ListView 不好,但是木有更好的解决办法了。 需求是这样的: 有很多条评论,评论是可以被回复的,回复是跟在评论下面的。 结果如下: 评论 1 回复 1 回复 2 回复 3 评论 2 回复 1 回复 2 回复 3 评论 3 评论 4 然后如果回复数超过 4 条,显示一个查看更多,点击查看更多显示全部的回复。(就是这个变态需求,现在搞糊涂了) 我用了 ListView 嵌套,查看更多作为里面的 ListView 的 footer ,但是会出现因为外面的 ListView 的复用 Item 的现象,用 tag 好像解决不了。 用 ExpandableListView 类似。 目前见过的就是百度贴吧(安卓版本)的帖子详情页的某个回贴的回复有这种 UI,具体怎么做,大神们给点建议,谢谢。
1
wohenyingyu01 2016-04-20 16:18:37 +08:00 1
这种只需要一个 ListView 就好了……
|
2
wanttofly OP @wohenyingyu01 我擦,为啥我编辑的和显示的不一样。一个 Listview 显示不出来啊。用多布局的那种吗?
|
3
dphdjy 2016-04-20 16:42:09 +08:00 via Android 1
|
5
twoyuan 2016-04-20 16:47:29 +08:00
嵌套的话里面那一层默认是不可滚动的也就没有 ListView 那些特性,如果评论太多,还包括头像之类的展开一下就比较恐怖了
|
6
TakWolf 2016-04-20 17:02:27 +08:00 1
楼主,只有一个办法,就是干死产品经理!
这个功能其实 extend listview 可以实现,你把展开的功能关闭,基本上就是一个二级索引结构,应该可以满足你的需求。 另外去看一下 bilibili 和 acfun 的 Android 客户端视频评论区的 List 实现 |
7
6v 2016-04-20 17:16:43 +08:00 1
我觉得楼上说的对,用 ExpandableListView 然后关闭折叠的功能就可以了。
我实现类似的功能时用的是这个控件 https://github.com/h6ah4i/android-advancedrecyclerview ,基于 Recycler View 而不是 ListView |
8
sodaless 2016-04-20 19:21:01 +08:00
你可以试试 RecyclerView 嵌套 RecyclerView......
|
10
zhgg0 2016-04-20 20:28:47 +08:00 1
只用一个 ListView 。
ListView 的每个 item 根据回复数 addView 。 基本不存在必须 ListView 嵌套 ListView 的场景。 |
12
pubby 2016-04-20 20:31:07 +08:00
用一个 listview ,绑定的数据预先处理好回复类型(回复,还是回复的回复,或者是“查看更多”),然后每个 item 里根据不同类型展示不同 view
|
13
pubby 2016-04-20 20:44:11 +08:00 1
有些追求极致性能的,会把原本大的 item 再拆成粒度更细的 item ,然后展开作为一个 list 数据绑定
比如 ================== a)头像,作者,时间 ---------------------------- b)内容 ---------------------------- c)评论 1 评论 2 d)更多 ================== 头像,作者,时间 ---------------------------- 内容 ---------------------------- 评论 1 评论 2 更多 ================== ....... 会预先处理好 a,b,c,d 四中数据类型,放到一个列表中 |
14
ericyl 2016-04-20 21:09:49 +08:00 via Android 1
@sonaive 相对来说 recyclerview 简单很多,毕竟官方直接放出了 type 方法
|
15
karnaugh 2016-04-20 23:56:55 +08:00 1
你把 adapter 下 getview 里的逻辑代码全放到 ViewHolder 里应该就好了。。。。(不知道这么说你能看懂么。。)
|
16
wanttofly OP |
17
karnaugh 2016-04-22 19:13:31 +08:00
都放进去。
在 holder 里放一个 Bean , item 的点击事件和显示都用这个 bean 的值, holder 里加个给 Bean 赋值的方法。 然后在 getView 里取得 holder 后调用赋值方法。大概是下边这样子。。假设有个 UserBean @Override public View getView(int position, View convertView, ViewGroup parent) { UserBean mBean = list.get(position); ViewHolder holder; if (convertView != null) { holder = (ViewHolder) convertView.getTag(); } else { convertView = View.inflate(mContext, R.layout.item_tagfragment, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } holder.updateBean(mBean); holder.upDateView(); return convertView; } class ViewHolder { @Bind(R.id.tv_name) TextView tv_name; ViewHolder(View view) { ButterKnife.bind(this, view); tv_name.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mBean.xxxxxxxxxxxxxxxx; } }); } private UserBean mBean; public void updateBean(UserBean bean) { this.mBean = bean; } public void upDateView() { tv_name.setText(mBean.getUserName()); } } |
18
wanttofly OP @karnaugh 额,这是 ListView Adapter 的代码优化?好像并没有对我的问题有所解决啊?我没看出来这样写和放在 getView 方法 里面赋值有什么区别啊。
|
19
karnaugh 2016-04-22 20:07:22 +08:00
@wanttofly 你不是说 item 复用有问题么。。。我意思是这么写的话 item 下的 onClick 事件不会出问题。。。
|
20
wanttofly OP @karnaugh sorry ,没表达清楚,是控件显示有问题,比如说评论 1 这个 item 下面有很多回复,那么回复 ListView 就应该有 footer ,然后评论 2 只有 1 条回复,那么回复 ListView 是没有 footer 的。 click 事件没问题。不过还是谢谢你的回答。
|
21
JeasonWong 2016-04-26 12:23:28 +08:00
FaceBook 工程师的博客中介绍的, FaceBook 的 listview 的 item 比较大,有时候甚至占到一屏幕一个 item ,每次滑动出现一个新的 item 时,需要在 getview 刷新一整个屏幕的数据,然而这些数据还未出现在用户面前,于是工程师将单个的 item 再次拆分成若干个小的部分,每一部分都是 listview 的一个 item ,使属于更加细分化,例如一个微博的 item ,拆分成 3 个 item ,头像昵称的一个,新闻内容的一个,评论转发的一个,这样有效减少每次渲染的数据,达到优化的目的
|
22
wanttofly OP @JeasonWong 谢谢回答。不过这样话对评论和回复两个 List 数据的处理太麻烦了,还有回复的查看更多和评论的加载更多功能处理起来也特别麻烦。
|
23
JeasonWong 2016-04-26 14:48:50 +08:00
@wanttofly 你如果用 recyclerView 就知道如果单纯的 addView 会有多卡了。。#话说你即使多层嵌套无非也就是想使用 addView 而已
|
24
wanttofly OP @JeasonWong 对,我现在使用的 addView(),好像还好,难道是因为我们的评论很少吗。。。还没看 coding 和 bilibili 的客户端,不过好像他们有这样的 样式,后边会再在帖子里总结写的。谢谢你的建议。
|