问题描述
我正在使用 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 工作正常。
这是我遵循的 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
}
}
}
解决方法
不要将适配器设置为适配器中的 RecyclerView,
将其设置在活动或片段中。
对于多个布局,请使用 ViewType。您还可以使用带有 setSpanSize() 的网格视图布局来设置布局。
在商店中查看应用程序 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
)。我仍然不知道这是否可行,但如果有人对此有答案,请发布,我可以将您的答案标记为正确。