clo*_*erk 2 android android-fragments android-recyclerview
如何创建一个 RecyclerView 的 ViewHolder 孩子实际上是 Fragments?
当前示例(不起作用,视图堆叠在彼此之上)
这是一个 Fragment 的 onResume(),它是一个 Activity 的主要内容
// 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);
Run Code Online (Sandbox Code Playgroud)
这是 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,这是在 FeedsAdapter 中膨胀的 feeds_view_holder 布局:
<?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>
Run Code Online (Sandbox Code Playgroud)
基本上问题是 RecyclerView 没有以预期的方式加载它的孩子(ViewHolders)。他们在彼此之上。我希望 RecyclerView 将片段加载为视图而不是绑定的典型视图。这甚至可能吗?我想我可以放弃 RecyclerView 但加载的内容是相当动态的(例如,有一个“收藏夹”部分,但如果您没有任何收藏夹,则不会显示它)。当我将 RecyclerView 与其中包含 RecyclerViews 的 ViewHolder 子项一起使用时,一切正常,但如果可能,我想使用 Fragments。
这不是一个好主意。
由于您从未回收或删除当前设计中的片段,因此最好在加载片段的LinearLayout周围使用ScrollView。这些片段的加载速度比使用 RecyclerView 稍快,但您不必与所有没有利用的回收基础设施作斗争。
这些片段是在彼此之上加载的,因为当您提交事务时,实际上并没有更改视图。你告诉片段管理器,“嘿,当你有机会时,你能把这个片段连接到这个 ViewGroup ID 吗?” 片段管理器使用它找到的该视图 ID 的第一个实例,因此它们会在彼此之上加载。
您可以通过为不同职位使用不同的 ID 来解决这个问题,但我不建议这样做。
| 归档时间: |
|
| 查看次数: |
5240 次 |
| 最近记录: |