gpt4 book ai didi

Android - 如果 View 不可见,则在 RecyclerViewAdapter 中添加 MapFragment 失败

转载 作者:太空狗 更新时间:2023-10-29 14:08:06 27 4
gpt4 key购买 nike

更新

我的用例是通过将 MapFragment 直接放在 xml 中而不是稍后添加它来解决的 - 但我保持这个问题悬而未决,因为我仍然不清楚为什么以编程方式添加它会失败。

原始问题

我有一个 CardView 列表,它们是 RecyclerViewAdapter 中的数据。

在我的一张卡片中,我将 SupportMapFragment 添加到一个 FrameLayout 中,在为卡片膨胀的布局中具有 id ma​​p_container .

ma​​p_card.xml

<merge
android:id="@+id/map_card"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="3dp"
card_view:cardElevation="2sp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<!-- Root layout for the card content that is created dynamically -->
<LinearLayout
android:id="@+id/card_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:id="@+id/map_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
</merge>

这就是我的适配器的工作方式

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
FrameLayout frame = new FrameLayout(parent.getContext());
frame.setLayoutParams(new RecyclerView.LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
return new ViewHolder(frame);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
ViewGroup container = (ViewGroup) viewHolder.itemView;
container.removeAllViews();

CardView cardView = cards.get(position);
ViewGroup parent = (ViewGroup) cardView.getParent();
if (parent != null) {
parent.removeView(cardView);
}
container.addView(cardView);
((CustomCard)cardView).onCardBind(fragment);
}

我正在获取 MapFragment 使用

GoogleMapOptions options = new GoogleMapOptions();
SupportMapFragment mapFragment = SupportMapFragment.newInstance(options);

然后我需要将 MapFragment 添加到卡片中...

如果卡片从一开始就在屏幕上可见 - 即,它是列表中的第一项或第二项 - 执行

FragmentManager fragmentManager = fragment.getChildFragmentManager();
fragmentManager.beginTransaction().add(R.id.map_container, mapFragment).commitAllowingStateLoss();

有效!!

但是如果卡片成为第 3 个项目,因此最初是不可见的,同样的代码会失败,因为 fragment 管理器找不到 ma​​p_container

ava.lang.IllegalArgumentException: No view found for id 0x7f0d018d (com.myapp.android:id/map_container) for fragment MapFragment{2b012f2b #0 id=0x7f0d018d}
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:886)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.app.BackStackRecord.run(BackStackRecord.java:833)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1454)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:447)

我尝试将代码移动到卡片 OnLayout 方法,在适配器 onBindViewHolder 中调用它 - 在添加 View 之前,在添加 View 之后 - 我总是得到同样的异常(exception) - 我怎样才能让它工作?

最佳答案

你应该在关闭 View 之前销毁它

fm = fragment.getChildFragmentManager();
mMapFragment = (SupportMapFragment) fm.findFragmentById(map.getId());
fm.beginTransaction().remove(mMapFragment).commitAllowingStateLoss();
container.removeView(map);

关于Android - 如果 View 不可见,则在 RecyclerViewAdapter 中添加 MapFragment 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31247126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com