是否可以在 Android 中使用带有
GridView
的类别或某种标题?
我快速地说明了我的想法:
非常感谢。
您可以直接使用 Stickygridheaders 库或作为模型来创建您自己的小部件。
可能这段代码会对您有所帮助。这是SectionedGridRecyclerViewAdapter,结果如下所示:
我认为你可以做到,但你必须实现 Jeff Shrkey 的 SeparatedListAdapter
没有一种简单的方法来创建这些单独的列表,因此我将分离列表适配器放在一起,它可以快速完成。总而言之,我们正在创建一个新的 BaseAdapter,它可以包含多个其他适配器,每个适配器都有自己的节标题。
您可以修改 Android RecyclerView 以在每行返回一个网格,请参阅 此处
Add the `gridrecyclerview` library to your project
implementation project(':gridrecyclerview')
添加库后,请按照以下步骤创建网格视图:
首先创建一个实现
GridRecyclerViewHelper
的辅助类。该类管理标题的创建、标题数据的绑定、网格视图的设置以及网格视图持有者的创建。
public class SampleGridRecyclerViewHelper implements GridRecyclerViewHelper<GridHeader> {
@NonNull
@Override
public RecyclerView.ViewHolder getHeaderViewHolder(@NonNull ViewGroup parent) {
ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.header_view, parent, false);
return new HeaderViewHolder(view);
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder, GridHeader headerItem) {
((HeaderViewHolder) holder).bind(headerItem);
}
@NonNull
@Override
public ViewGroup getGridView(GridHeader key, @NonNull ViewGroup parent) {
switch (key.getKey()) {
case ACTOR:
return (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.actor_view, parent, false);
case GENRE:
return (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.genre_view, parent, false);
case MOVIE:
return (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_view, parent, false);
case STUDIO:
return (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.studio_view, parent, false);
case DIRECTOR:
return (ViewGroup) LayoutInflater.from(parent.getContext()).inflate(R.layout.director_view, parent, false);
default:
throw new IllegalArgumentException("Unknown Header Key Value");
}
}
@NonNull
@Override
public GridCellViewHolder getGridViewHolder(GridHeader key, @NonNull ViewGroup parent) {
switch (key.getKey()) {
case ACTOR:
return new ActorViewHolder(parent);
case GENRE:
return new GenreViewHolder(parent);
case MOVIE:
return new MovieViewHolder(parent);
case STUDIO:
return new StudioViewHolder(parent);
case DIRECTOR:
return new DirectorViewHolder(parent);
default:
throw new IllegalArgumentException("Unknown Header Key Value");
}
}
}
GridHeader
类充当普通旧式Java对象(POJO),保存有关网格部分标题的信息。
接下来,实现
GridCellViewHolder
接口以有效地将数据绑定到每种类型的网格单元。
public abstract class GridCellViewHolder<T> extends RecyclerView.ViewHolder {
// Implement the bind method to efficiently bind data to the ViewHolder.
}
例如,为 actor 单元创建一个专门的 ViewHolder:
public class ActorViewHolder extends GridCellViewHolder<Actor> {
private final Context context;
private final TextView name;
private final ImageView image;
public ActorViewHolder(@NonNull View itemView) {
super(itemView);
this.context = itemView.getContext();
this.name = itemView.findViewById(R.id.name);
this.image = itemView.findViewById(R.id.image);
}
@Override
public void bind(Actor actor) {
this.name.setText(actor.getName());
this.image.setImageDrawable(getDrawableFromName(context, actor.getImage()));
}
}