在 RecyclerView 适配器中设置 LayoutManager 类型

问题描述

我正在使用 ConcatAdapter 为我的 RecyclerView 设置标题。我使用了两个 RecyclerAdapters一个不需要 LayoutManager,另一个需要 GridLayoutManager。我如何正确LayoutManager 类中设置 RecyclerAdapter?我试过了,它没有抛出任何错误,但没有显示数据。

@NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.viewholder_card_preview,parent,false);

        int spacing = GridAdapterSpacingUtils.convertIntToDP(context,GRID_VIEW_SPACING);

        RecyclerView recyclerView = view.findViewById(R.id.recyclerview);

        GridLayoutManager gridLayoutManager = new GridLayoutManager(context,GRID_VIEW_ROWCOUNT);
        recyclerView.addItemdecoration(new GridAdapterItemdecoration(
                GRID_VIEW_ROWCOUNT,spacing,false)
        );

        recyclerView.setLayoutManager(gridLayoutManager);
        recyclerView.setAdapter(this);
        
        return new ViewHolder(view);
    }

没有语法错误,但我不确定我做错了什么。 (当我在没有 ConcatAdapter 的情况下对其进行测试时,Grid Recycler 工作正常。

enter image description here

这是我遵循的 Medium 帖子中的 Kotlin 语法,所以我不确定等效的 Java 语法是什么。

class BaseGridConcatAdapter(private val context: Context,private val animalAdapter: AnimalAdapter,private val spanCount:Int) :
    RecyclerView.Adapter<BaseConcatHolder<*>>() {

    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): BaseConcatHolder<*> {
        val view = LayoutInflater.from(context).inflate(R.layout.animal_concat_row,false)
        view.rv_animal_concat.layoutManager = GridLayoutManager(context,spanCount)
        return ConcatViewHolder(view)
    }

    override fun getItemCount(): Int  = 1

    override fun onBindViewHolder(holder: BaseConcatHolder<*>,position: Int) {
        when(holder){
            is ConcatViewHolder -> holder.bind(animalAdapter)
            else -> throw IllegalArgumentException("No viewholder to show this data,did you forgot to add it to the onBindViewHolder?")
        }
    }

    inner class ConcatViewHolder(itemView: View): BaseConcatHolder<AnimalAdapter>(itemView){
        override fun bind(adapter: AnimalAdapter) {
            itemView.rv_animal_concat.adapter = adapter
        }
    }
}

https://medium.com/@gsaillen95/how-to-inflate-different-layoutmanagers-for-each-adapter-with-concatadapter-76cdee6266ca

解决方法

不要将适配器设置为适配器中的 RecyclerView,

将其设置在活动或片段中。

对于多个布局,请使用 ViewType。您还可以使用带有 setSpanSize() 的网格视图布局来设置布局。

看看这张图片。我现在正在努力 example

working on this kind of work now

在商店中查看应用程序 link to live app on the store

,

使用 extends RecyclerView.Adapter<RecyclerView.ViewHolder> 时 当 RecyclerView 被附加时有一个回调方法,如果你在上面这样做并尝试在 onCreateViewHolder 中获取对 RecyclerView 的引用,它将返回 null。

@Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        //Change the layout manager here
        GridLayoutManager gridLayoutManager = new GridLayoutManager(context,GRID_VIEW_COLUMN_COUNT);
        recyclerView.setLayoutManager(gridLayoutManager);
    }

就我而言,我试图将多个 LayoutManager 类型添加到连接适配器 (e.g HorizontalLayout,VerticalLayout,GridLayout managers)。我仍然不知道这是否可行,但如果有人对此有答案,请发布,我可以将您的答案标记为正确。