求助: Android ListView 嵌套 ListView 问题

2016-04-20 16:00:13 +08:00
 wanttofly

好吧,别看标题就跑了。我知道 ListView 嵌套 ListView 不好,但是木有更好的解决办法了。 需求是这样的: 有很多条评论,评论是可以被回复的,回复是跟在评论下面的。 结果如下: 评论 1 回复 1 回复 2 回复 3 评论 2 回复 1 回复 2 回复 3 评论 3 评论 4 然后如果回复数超过 4 条,显示一个查看更多,点击查看更多显示全部的回复。(就是这个变态需求,现在搞糊涂了) 我用了 ListView 嵌套,查看更多作为里面的 ListView 的 footer ,但是会出现因为外面的 ListView 的复用 Item 的现象,用 tag 好像解决不了。 用 ExpandableListView 类似。 目前见过的就是百度贴吧(安卓版本)的帖子详情页的某个回贴的回复有这种 UI,具体怎么做,大神们给点建议,谢谢。

9049 次点击
所在节点    Android
24 条回复
wohenyingyu01
2016-04-20 16:18:37 +08:00
这种只需要一个 ListView 就好了……
wanttofly
2016-04-20 16:42:08 +08:00
@wohenyingyu01 我擦,为啥我编辑的和显示的不一样。一个 Listview 显示不出来啊。用多布局的那种吗?
dphdjy
2016-04-20 16:42:09 +08:00
举个栗子
coding.net 的冒泡
coolapk 的评论

一共就 5 条而已~直接插 view 不就行了~
wanttofly
2016-04-20 16:45:45 +08:00
@dphdjy 只能感谢 10 个铜币!跪谢!这就去看 coding 的代码!非常感谢!!!
twoyuan
2016-04-20 16:47:29 +08:00
嵌套的话里面那一层默认是不可滚动的也就没有 ListView 那些特性,如果评论太多,还包括头像之类的展开一下就比较恐怖了
TakWolf
2016-04-20 17:02:27 +08:00
楼主,只有一个办法,就是干死产品经理!

这个功能其实 extend listview 可以实现,你把展开的功能关闭,基本上就是一个二级索引结构,应该可以满足你的需求。

另外去看一下 bilibili 和 acfun 的 Android 客户端视频评论区的 List 实现
6v
2016-04-20 17:16:43 +08:00
我觉得楼上说的对,用 ExpandableListView 然后关闭折叠的功能就可以了。
我实现类似的功能时用的是这个控件 https://github.com/h6ah4i/android-advancedrecyclerview ,基于 Recycler View 而不是 ListView
sodaless
2016-04-20 19:21:01 +08:00
你可以试试 RecyclerView 嵌套 RecyclerView......
ericyl
2016-04-20 20:21:17 +08:00
@sodaless recyclerview 支持多布局类型了为什么还要再嵌套一个
zhgg0
2016-04-20 20:28:47 +08:00
只用一个 ListView 。
ListView 的每个 item 根据回复数 addView 。
基本不存在必须 ListView 嵌套 ListView 的场景。
sonaive
2016-04-20 20:29:47 +08:00
@ericyl 其实 listview 也支持。自定义评论 view 就行了
pubby
2016-04-20 20:31:07 +08:00
用一个 listview ,绑定的数据预先处理好回复类型(回复,还是回复的回复,或者是“查看更多”),然后每个 item 里根据不同类型展示不同 view
pubby
2016-04-20 20:44:11 +08:00
有些追求极致性能的,会把原本大的 item 再拆成粒度更细的 item ,然后展开作为一个 list 数据绑定

比如
==================
a)头像,作者,时间
----------------------------
b)内容
----------------------------
c)评论 1
评论 2
d)更多
==================
头像,作者,时间
----------------------------
内容
----------------------------
评论 1
评论 2
更多
==================
.......



会预先处理好 a,b,c,d 四中数据类型,放到一个列表中
ericyl
2016-04-20 21:09:49 +08:00
@sonaive 相对来说 recyclerview 简单很多,毕竟官方直接放出了 type 方法
karnaugh
2016-04-20 23:56:55 +08:00
你把 adapter 下 getview 里的逻辑代码全放到 ViewHolder 里应该就好了。。。。(不知道这么说你能看懂么。。)
wanttofly
2016-04-21 09:10:17 +08:00
@karnaugh 你是指点击处理事件吗?还是说赋值?

@zhgg0 现在用的 addView 这种处理方式,可以了。谢谢。回头看下楼上的几位说的 coding 和 bilibili 怎么实现的,尝试了之后再来回复,不过可能会晚点,最近产品经理催的急,唉。
@pubby 对,好像这样也可以,就只想着两种类型了,我会试下这种方式的。谢谢。
@6v ExpandableListView 其实还是 ListView 嵌套 ListView ,会有里面的 item 复用的问题,我试过了,好像不行。不知道 15 楼说的那个方法能解决不。
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());
}
}
wanttofly
2016-04-22 19:43:24 +08:00
@karnaugh 额,这是 ListView Adapter 的代码优化?好像并没有对我的问题有所解决啊?我没看出来这样写和放在 getView 方法 里面赋值有什么区别啊。
karnaugh
2016-04-22 20:07:22 +08:00
@wanttofly 你不是说 item 复用有问题么。。。我意思是这么写的话 item 下的 onClick 事件不会出问题。。。
wanttofly
2016-04-24 13:43:41 +08:00
@karnaugh sorry ,没表达清楚,是控件显示有问题,比如说评论 1 这个 item 下面有很多回复,那么回复 ListView 就应该有 footer ,然后评论 2 只有 1 条回复,那么回复 ListView 是没有 footer 的。 click 事件没问题。不过还是谢谢你的回答。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/272549

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX