Android GridView 带类别?

问题描述 投票:0回答:4

是否可以在 Android 中使用带有

GridView
的类别或某种标题?

我快速地说明了我的想法:

enter image description here

非常感谢。

android gridview android-3.0-honeycomb
4个回答
15
投票

您可以直接使用 Stickygridheaders 库或作为模型来创建您自己的小部件。


3
投票

可能这段代码会对您有所帮助。这是SectionedGridRecyclerViewAdapter,结果如下所示:


2
投票

我认为你可以做到,但你必须实现 Jeff Shrkey 的 SeparatedListAdapter

没有一种简单的方法来创建这些单独的列表,因此我将分离列表适配器放在一起,它可以快速完成。总而言之,我们正在创建一个新的 BaseAdapter,它可以包含多个其他适配器,每个适配器都有自己的节标题。


2
投票


您可以修改 Android RecyclerView 以在每行返回一个网格,请参阅 此处

Add the `gridrecyclerview` library to your project
implementation project(':gridrecyclerview')

添加库后,请按照以下步骤创建网格视图:

1.实现 GridRecyclerViewHelper

首先创建一个实现

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),保存有关网格部分标题的信息。

2.为每个网格单元实现 ViewHolder

接下来,实现

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()));
    }
}

GridView with sample movies data

© www.soinside.com 2019 - 2024. All rights reserved.