Android 片段作为回收视图';谁是观众?

Android 片段作为回收视图';谁是观众?,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,如何创建一个RecyclerView,谁的ViewHolder子对象实际上是片段 当前示例(不起作用,视图堆叠在一起) 下面是一个片段的onResume(),该片段是活动的主要内容 // onResume() in FragmentA (main content of an Activity) recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(5)); RecyclerView.LayoutManager layoutM

如何创建一个RecyclerView,谁的ViewHolder子对象实际上是片段

当前示例(不起作用,视图堆叠在一起)

下面是一个片段的onResume(),该片段是活动的主要内容

// onResume() in FragmentA (main content of an Activity)
recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(5));
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
List<Fragment> fragments = new LinkedList<>();
fragments.add(FeaturedRecyclerFragment.newInstance(R.string.recycler_title_featured));
fragments.add(TrendingRecyclerFragment.newInstance(R.string.recycler_title_trending));
FeedsAdapter recyclerAdapter = new FeedsAdapter(getContext(), getFragmentManager(), fragments);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(recyclerAdapter);
//FragmentA中的onResume()(活动的主要内容)
回收视图。附加装饰(新的垂直空间项目装饰(5));
RecyclerView.LayoutManager LayoutManager=新建LinearLayoutManager(getContext(),LinearLayoutManager.VERTICAL,false);
列表片段=新建LinkedList();
add(FeaturedRecyclerFragment.newInstance(R.string.recycler\u title\u featured));
add(TrendingRecyclerFragment.newInstance(R.string.recycler\u title\u trending));
FeedsAdapter recyclerAdapter=新的FeedsAdapter(getContext(),getFragmentManager(),fragments);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(recyclerAdapter);
以下是RecyclerView适配器代码:

public class FeedsAdapter extends RecyclerView.Adapter<FeedsAdapter.FeedsViewHolder> {

    private static final String TAG = FeedsAdapter.class.getSimpleName();

    private final Context context;
    private FragmentManager fragmentManager;
    private final List<Fragment> fragments;

    public FeedsAdapter(Context context, FragmentManager fragmentManager, List<Fragment> fragments) {
        this.context = context;
        this.fragmentManager = fragmentManager;
        this.fragments = fragments;
    }

    @Override
    public FeedsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.d(TAG, "onCreateViewHolder()");
        View itemView = LayoutInflater.from(context).inflate(R.layout.feeds_view_holder, parent, false);
        return new FeedsViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(FeedsViewHolder holder, int position) {
        Log.d(TAG, "onBindViewHolder() " + position);
        if (fragmentManager == null) {
            throw new IllegalArgumentException("LoaderManager null, cannot bind view holder");
        }

        Fragment fragment = fragments.get(position);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(holder.itemView.getId(), fragment, TAG + "pos" + position);
        transaction.commit();
    }

    @Override
    public int getItemCount() {
        Log.d(TAG, "getItemCount()");
        return fragments.size();
    }

    static class FeedsViewHolder extends RecyclerView.ViewHolder {

        public FeedsViewHolder(View itemView) {
            super(itemView);
        }
    }
}
公共类FeedsAdapter扩展了RecyclerView.Adapter{
私有静态最终字符串标记=FeedsAdapter.class.getSimpleName();
私人最终语境;
私人碎片管理器碎片管理器;
私人最终名单碎片;
公共FeedsAdapter(上下文上下文、碎片管理器碎片管理器、列表碎片){
this.context=上下文;
this.fragmentManager=fragmentManager;
this.fragments=片段;
}
@凌驾
公共FeedsViewHolder onCreateViewHolder(视图组父级,int-viewType){
d(标记“onCreateViewHolder()”);
View itemView=LayoutFlater.from(上下文)。充气(R.layout.feeds\u View\u holder,parent,false);
返回新的FeedsViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(FeedsViewHolder,内部位置){
Log.d(标记“onBindViewHolder()”+位置);
if(fragmentManager==null){
抛出新的IllegalArgumentException(“LoaderManager null,无法绑定视图持有者”);
}
Fragment Fragment=fragments.get(位置);
FragmentTransaction=fragmentManager.beginTransaction();
transaction.add(holder.itemView.getId(),片段,标记+“pos”+位置);
commit();
}
@凌驾
public int getItemCount(){
Log.d(标记“getItemCount()”);
返回fragments.size();
}
静态类FeedsViewHolder扩展了RecyclerView.ViewHolder{
公共FeedsView文件夹(视图项视图){
超级(项目视图);
}
}
}
最后,这里是FeedsAdapter中膨胀的feeds\u view\u支架布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/recycler_fragment_container">

</FrameLayout>


基本上,问题在于RecyclerView没有以预期的方式加载它的子对象(视图持有者)。他们在一起。我希望RecyclerView将片段作为视图而不是绑定的典型视图加载。这可能吗?我想我可以放弃RecyclerView,但加载的内容是相当动态的(例如,有一个“favorite feeds”部分,但如果没有任何收藏夹,则不会显示)。当我使用带有ViewHolder子对象的RecyclerView时,一切都很顺利,但如果可能的话,我想使用片段。

这不是一个好主意

因为在当前的设计中,您从来没有回收或移除过片段,所以最好使用一个将片段加载到其中的容器。碎片的加载速度将比使用RecyclerView稍快一些,但您不必与所有未利用的回收基础设施进行斗争

这些片段彼此重叠加载,因为在提交事务时,实际上并没有更改视图。你告诉片段管理器,“嘿,当你有机会的时候,你能把这个片段连接到这个视图组ID吗?”片段管理器使用它找到的视图ID的第一个实例,因此它们被加载到彼此之上


您可以通过为不同的位置使用不同的ID来解决这一问题,但我不建议这样做。

尝试将根视图组从framelayout更改为linear layout,以防止视图相互绘制。

干杯。我将返回到我原来的解决方案,或者创建一个ScrollView布局。使用标记来解决这个问题怎么样?我自己也有问题。你可以用自定义视图组替换片段。最简单的解决方案是返回到我的原始设计,或者尝试在线性布局周围使用@blahdiblah ScrollView。我可能稍后尝试你的建议,看看它是否有效,以及它是否可以很好地执行。我在搜索解决方案时找到了。这似乎是我想要的,很可能其他人也会遇到同样的问题。