我碰到个需求是这样的
图片.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;
}
}
}
}
成功解决!!!
网友评论