美文网首页
Listview 里面嵌套 Fragment

Listview 里面嵌套 Fragment

作者: 拾壹丶ban | 来源:发表于2019-04-03 11:11 被阅读0次

    我碰到个需求是这样的


    图片.png

    这是一个列表
    列表里面还是个列表,然后有各个条目,这样的


    图片.png

    我乍一看,这不就是多布局操作么,好我写几个itemType,但是呢那个上传图片我是封装到一个fragment里面操作的于是我跑一遍打开之后,发现闪退了,我在网上找啊找,终于找到让我死心的答案

    那就是Listview 里面嵌套 Fragment这样做是不可以

    废了半天劲之后,发现个帖子 https://bbs.csdn.net/topics/390763728,其中摘要

    https://stackoverflow.com/questions/18645316/add-fragment-into-listview-item stackoverflow提的问题

    Fragment are managed by Activity's FragmentManager or by other Fragments child FragmentManager; while list item views are managed by ListView & ListAdapter. You can use ListViews in Fragments, but not the other way around.

    Fragment需要使用FragmentManager管理。
    list item 是使用 ListView & ListAdapter管理的。
    可以在Fragments使用ListViews,反过来却不行。

    于是我就切换了思路,以为第一层的list条目不会太多,我就直接addview吧。然后跑一遍发现,只有第一个item显示是什么鬼。
    我仔细研究了一下,应该是因为这个repalce的id是一样的,于是我就改了改

        <LinearLayout
            android:visibility="gone"
            android:id="@+id/ll_other_remark"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingTop="18dp">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingLeft="16dp"
                android:paddingRight="16dp">
              ......
            </LinearLayout>
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp" />
    
            <View
                android:layout_width="match_parent"
                android:layout_height="0.5dp"
                android:layout_alignParentBottom="true"
                android:background="@color/color_ececec" />
        </LinearLayout>
    

    首先把FrameLayout的id去掉

         View childAt = ll_other_remark.getChildAt(1);
         childAt.setId(IdiUtils.generateViewId());
    

    通过childAt找到view,再setId。setId遇到个问题,用系统的View.generateViewId;但是要求minSdk 17,很不幸我们的项目才16.所以就找到了一个自己生成的

    public class IdiUtils {
    
    
        private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);
    
        public static int generateViewId() {
    
            for (; ; ) {
    
                final int result = sNextGeneratedId.get();
    
    // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
    
                int newValue = result + 1;
    
                if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
    
                if (sNextGeneratedId.compareAndSet(result, newValue)) {
    
                    return result;
    
                }
    
            }
    
        }
    
    
    }
    
    

    成功解决!!!

    欢迎打赏

    欢迎打赏

    相关文章

      网友评论

          本文标题:Listview 里面嵌套 Fragment

          本文链接:https://www.haomeiwen.com/subject/treabqtx.html