求助: Android ListView 嵌套 ListView 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wanttofly
0D
V2EX    Android

求助: Android ListView 嵌套 ListView 问题

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

    好吧,别看标题就跑了。我知道 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     Solana     1111 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 17:54 PVG 01:54 LAX 09:54 JFK 12:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86