具有两列的GridView,第一项跨越两列

我有一个Imageview&一个GridView ..

我的布局devise在这里..

在这里输入图像说明

我想将这两个视图组合成单个gridview

我的问题:

如何设置gridview第一项跨越两列?

在研究你的问题时,我学到了一些新东西:碰巧看看GridLayoutManager for RecyclerView ,我注意到你可以设置一个自定义的SpanSizeLookup 。 现在“跨度”只是一个列,如果你是垂直滚动和一个横向滚动。 因此, SpanSizeLookup允许您指定例如项目0取2列,项目1取1列等。

事实certificate,如果您使用GridLayoutManager使用RecyclerView ,则解决scheme非常简单:

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create a grid layout with two columns GridLayoutManager layoutManager = new GridLayoutManager(this, 2); // Create a custom SpanSizeLookup where the first item spans both columns layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return position == 0 ? 2 : 1; } }); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(new MyGridAdapter()); } 

我创build了一个testing项目,只是为了试用它,并确保它做到了我的预期,而且它的工作方式就像一个魅力。


有关适配器的说明: RecyclerView.AdapterListAdapter不兼容。 您需要从RecyclerView.Adapter扩展适配器并进行相应的更改。

这里是我为我的testing项目创build的适配器:

  public static class MyViewHolder extends RecyclerView.ViewHolder { ImageView mImageView; TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mImageView = (ImageView) itemView.findViewById(R.id.imageView); mTextView = (TextView) itemView.findViewById(R.id.textView); } } public static class MyGridAdapter extends RecyclerView.Adapter<MyViewHolder> { private int[] mDrawables; public MyGridAdapter() { this.mDrawables = new int[] { R.drawable.images_01, R.drawable.images_02, . . . }; } @Override public int getItemCount() { return mDrawables.length; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.layout_grid_item, parent, false); MyViewHolder holder = new MyViewHolder(view); // set up any onClickListener you need on the view here return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.mImageView.setImageResource(mDrawables[position]); holder.mTextView.setText("Image " + position); } } 

首先,创build一个RecyclerView.ViewHolder子类。 视图持有者模式现在是这种做适配器视图的新方法的组成部分。 您的ViewHolder将为您的视图设置所有的子视图。

然后在您的RecyclerView.Adapter子类中,重写onCreateViewHolder()onBindViewHolder() 。 在onCreateViewHolder()你膨胀你的看法,并构buildViewHolder 。 在onBindViewHolder() ,您使用position来获取适配器数据,并使用ViewHolder设置子视图。 所以RecyclerView技术上回收包含ViewViewHolder

一旦你对你的适配器做了这些改变,你应该全部设置好。