V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wanttofly
V2EX  ›  Android

求助: Android ListView 嵌套 ListView 问题

  •  
  •   wanttofly · 2016-04-20 16:00:13 +08:00 · 7863 次点击
    这是一个创建于 2929 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    24 条回复    2016-04-26 15:50:54 +08:00
    wohenyingyu01
        1
    wohenyingyu01  
       2016-04-20 16:18:37 +08:00   ❤️ 1
    这种只需要一个 ListView 就好了……
    wanttofly
        2
    wanttofly  
    OP
       2016-04-20 16:42:08 +08:00
    @wohenyingyu01 我擦,为啥我编辑的和显示的不一样。一个 Listview 显示不出来啊。用多布局的那种吗?
    dphdjy
        3
    dphdjy  
       2016-04-20 16:42:09 +08:00 via Android   ❤️ 1
    举个栗子
    coding.net 的冒泡
    coolapk 的评论

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

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

    另外去看一下 bilibili 和 acfun 的 Android 客户端视频评论区的 List 实现
    6v
        7
    6v  
       2016-04-20 17:16:43 +08:00   ❤️ 1
    我觉得楼上说的对,用 ExpandableListView 然后关闭折叠的功能就可以了。
    我实现类似的功能时用的是这个控件 https://github.com/h6ah4i/android-advancedrecyclerview ,基于 Recycler View 而不是 ListView
    sodaless
        8
    sodaless  
       2016-04-20 19:21:01 +08:00
    你可以试试 RecyclerView 嵌套 RecyclerView......
    ericyl
        9
    ericyl  
       2016-04-20 20:21:17 +08:00 via Android
    @sodaless recyclerview 支持多布局类型了为什么还要再嵌套一个
    zhgg0
        10
    zhgg0  
       2016-04-20 20:28:47 +08:00   ❤️ 1
    只用一个 ListView 。
    ListView 的每个 item 根据回复数 addView 。
    基本不存在必须 ListView 嵌套 ListView 的场景。
    sonaive
        11
    sonaive  
       2016-04-20 20:29:47 +08:00 via Android
    @ericyl 其实 listview 也支持。自定义评论 view 就行了
    pubby
        12
    pubby  
       2016-04-20 20:31:07 +08:00
    用一个 listview ,绑定的数据预先处理好回复类型(回复,还是回复的回复,或者是“查看更多”),然后每个 item 里根据不同类型展示不同 view
    pubby
        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 四中数据类型,放到一个列表中
    ericyl
        14
    ericyl  
       2016-04-20 21:09:49 +08:00 via Android   ❤️ 1
    @sonaive 相对来说 recyclerview 简单很多,毕竟官方直接放出了 type 方法
    karnaugh
        15
    karnaugh  
       2016-04-20 23:56:55 +08:00   ❤️ 1
    你把 adapter 下 getview 里的逻辑代码全放到 ViewHolder 里应该就好了。。。。(不知道这么说你能看懂么。。)
    wanttofly
        16
    wanttofly  
    OP
       2016-04-21 09:10:17 +08:00
    @karnaugh 你是指点击处理事件吗?还是说赋值?

    @zhgg0 现在用的 addView 这种处理方式,可以了。谢谢。回头看下楼上的几位说的 coding 和 bilibili 怎么实现的,尝试了之后再来回复,不过可能会晚点,最近产品经理催的急,唉。
    @pubby 对,好像这样也可以,就只想着两种类型了,我会试下这种方式的。谢谢。
    @6v ExpandableListView 其实还是 ListView 嵌套 ListView ,会有里面的 item 复用的问题,我试过了,好像不行。不知道 15 楼说的那个方法能解决不。
    karnaugh
        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());
    }
    }
    wanttofly
        18
    wanttofly  
    OP
       2016-04-22 19:43:24 +08:00
    @karnaugh 额,这是 ListView Adapter 的代码优化?好像并没有对我的问题有所解决啊?我没看出来这样写和放在 getView 方法 里面赋值有什么区别啊。
    karnaugh
        19
    karnaugh  
       2016-04-22 20:07:22 +08:00
    @wanttofly 你不是说 item 复用有问题么。。。我意思是这么写的话 item 下的 onClick 事件不会出问题。。。
    wanttofly
        20
    wanttofly  
    OP
       2016-04-24 13:43:41 +08:00
    @karnaugh sorry ,没表达清楚,是控件显示有问题,比如说评论 1 这个 item 下面有很多回复,那么回复 ListView 就应该有 footer ,然后评论 2 只有 1 条回复,那么回复 ListView 是没有 footer 的。 click 事件没问题。不过还是谢谢你的回答。
    JeasonWong
        21
    JeasonWong  
       2016-04-26 12:23:28 +08:00
    FaceBook 工程师的博客中介绍的, FaceBook 的 listview 的 item 比较大,有时候甚至占到一屏幕一个 item ,每次滑动出现一个新的 item 时,需要在 getview 刷新一整个屏幕的数据,然而这些数据还未出现在用户面前,于是工程师将单个的 item 再次拆分成若干个小的部分,每一部分都是 listview 的一个 item ,使属于更加细分化,例如一个微博的 item ,拆分成 3 个 item ,头像昵称的一个,新闻内容的一个,评论转发的一个,这样有效减少每次渲染的数据,达到优化的目的
    wanttofly
        22
    wanttofly  
    OP
       2016-04-26 13:41:32 +08:00
    @JeasonWong 谢谢回答。不过这样话对评论和回复两个 List 数据的处理太麻烦了,还有回复的查看更多和评论的加载更多功能处理起来也特别麻烦。
    JeasonWong
        23
    JeasonWong  
       2016-04-26 14:48:50 +08:00
    @wanttofly 你如果用 recyclerView 就知道如果单纯的 addView 会有多卡了。。#话说你即使多层嵌套无非也就是想使用 addView 而已
    wanttofly
        24
    wanttofly  
    OP
       2016-04-26 15:50:54 +08:00
    @JeasonWong 对,我现在使用的 addView(),好像还好,难道是因为我们的评论很少吗。。。还没看 coding 和 bilibili 的客户端,不过好像他们有这样的 样式,后边会再在帖子里总结写的。谢谢你的建议。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1005 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:51 · PVG 02:51 · LAX 11:51 · JFK 14:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.