美文网首页
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