如何在android gridview中为行设置不同的列

我想有一个类似于这个gridview

在这里输入图像说明

每一个奇数行将有两个大尺寸的图像,偶数行将有四个较小的图像。我怎样才能做到这一点?

Solutions Collecting From Web of "如何在android gridview中为行设置不同的列"

我有类似的东西,我用新的RecyclerView解决。

我创build了一个RecyclerView的片段。 RecyclerView on xml:

 <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/filter_subtypes" android:layout_width="match_parent" android:layout_height="match_parent" /> 

在你的片段/活动(OnViewCreated在我的片段的情况下)。 我find了RecyclerView,并设置一个适配器 – 从RecyclerView.Adapter <YOUR VIEW HOLDER类>inheritance的一个普通的适配器类 – 然后我创build一个GridLayoutManager

 final GridLayoutManager mng_layout = new GridLayoutManager(this.getActivity(), TOTAL_CELLS_PER_ROW/*In your case 4*/); 

然后我重写这个方法来设置一个dynamic数字的列(单元格)

 mng_layout.setSpanSizeLookup( new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { switch( adapterSubtype.getItemViewType(position) ) { case FilterSubtypesAdapter.TYPE_LOW: return TOTAL_CELLS_PER_ROW; case FilterSubtypesAdapter.TYPE_HIGH: return 2; default: return -1; } } }); myRecyclerView.setLayoutManager(mng_layout); 

有了这个,你将在你的行上获得dynamic的单元格数量。

另外:如果您在适配器上使用相同的视图/types视图,则会得到相同的w&h视图。 您将需要为TYPE_HIGH创build2个xml视图,为TYPE_LOW创build其他视图。

所以,在你的适配器中,你需要有2种数据(1为高图像,1为低图像)。 你必须重写这个方法

 @Override public SubtypeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = null; if (viewType==TYPE_HIGH) { view = inflater.inflate(R.layout.item_image_high, parent, false); } else { view = inflater.inflate(R.layout.item_image_low, parent, false); } return new SubtypeViewHolder(view, viewType); } @Override public int getItemViewType(int position) { return (list.get(position).getType()==Subtype_type.HIGH) ? TYPE_HIGH : TYPE_LOW; } 

我希望我清楚,任何问题告诉我。

而不是考虑一个单一的图像视图,我将三个图像的组作为一个单一的网格项目,

在这里输入图像说明

尝试在您的网格适配器内

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linear" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/green" android:orientation="vertical"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY" android:src="@drawable/user" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/image_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:scaleType="fitXY" android:src="@drawable/user" /> <ImageView android:id="@+id/image_2" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/user" android:scaleType="fitXY" android:layout_weight="1" /> </LinearLayout> </LinearLayout> 

和你的网格视图会像

 <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="2" > </GridView> 

唯一需要注意的就是图像的顺序。 可能这会帮助你

如果您正在使用RecyclerView for GridView ,那么有解决scheme应该为你工作:

 GridLayoutManager layoutManager = new GridLayoutManager(this, 4); layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int mod = position % 6; if(position == 0 || position == 1) return 2; else if(position < 6) return 1; else if(mod == 0 || mod == 1) return 2; else return 1; } }); recyclerView.setLayoutManager(layoutManager); 

希望为你工作!

我想最好的办法是使用回收视图..也是优于列表/网格的性能

可能下面的链接可以帮助很多 – 所有都与卢卡斯的双向查看有关

https://github.com/lucasr/twoway-view

https://plus.google.com/+LucasRocha/posts/WBaryNqAHiy

http://lucasr.org/2014/07/31/the-new-twowayview/

有什么工作在我的项目中,我有不同的单元格高度和标题

在这里输入图像说明

适配器:

 public class AdapterRecViewMain extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<BaseMarkerElement> mainCardList; private final int HEADER_VIEW = 0; private final int FOOTER_VIEW = 1; public AdapterRecViewMain() { } public void setData(List<BaseMarkerElement> mainCardList) { this.mainCardList = mainCardList; } @Override public int getItemViewType(int position) { if (position == 0) { return HEADER_VIEW; } return FOOTER_VIEW; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { if (type == FOOTER_VIEW) { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.card_main_activity, viewGroup, false); return new MainCardViewHolder(v); } else { View v = LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.header_view_main_activity, viewGroup, false); return new HeaderViewHolder(v); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int positionItem) { final int position = viewHolder.getAdapterPosition(); if (viewHolder instanceof HeaderViewHolder) { StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams(); layoutParams.setFullSpan(true); BaseMarkerElement item = mainCardList.get(position); if (item instanceof HeaderView) { HeaderView header = (HeaderView) mainCardList.get(position); // need to add implementation } } else if (viewHolder instanceof MainCardViewHolder) { MainCardViewHolder currentView = (MainCardViewHolder) viewHolder; CardMainActivity currentCard = (CardMainActivity) mainCardList.get(position); currentView.ivMainCard.setImageResource(currentCard.getIvMainCard()); currentView.tvBrandName.setText(currentCard.getTvBrandName()); currentView.tvPrice.setText(currentCard.getTvPrice()); currentView.tvType.setText(currentCard.getTvType()); } } @Override public int getItemCount() { return mainCardList.size(); } private class MainCardViewHolder extends RecyclerView.ViewHolder { ImageView ivMainCard; TextView tvBrandName; TextView tvType; TextView tvPrice; MainCardViewHolder(View view) { super(view); ivMainCard = (ImageView) view.findViewById(R.id.imageViewMainCard); tvBrandName = (TextView) view.findViewById(R.id.tvBrandName); tvType = (TextView) view.findViewById(R.id.tvType); tvPrice = (TextView) view.findViewById(R.id.tvPrice); } } private class HeaderViewHolder extends RecyclerView.ViewHolder { public HeaderViewHolder(View itemView) { super(itemView); } } } 

在你的活动中:

 private AdapterRecViewMain adapter; private RecyclerView rvMain; @Override protected void onResume() { super.onResume(); Logger.logGeneral("onResume()"); if (adapter == null) { setUpRecView(); } } private void setUpRecView() { adapter = new AdapterRecViewMain(); adapter.setData(controller.loadData()); rvMain = (RecyclerView) findViewById(R.id.rvMain); final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); rvMain.setLayoutManager(layoutManager); rvMain.addOnScrollListener(scrollListener); rvMain.setAdapter(adapter); adapter.notifyDataSetChanged(); rvMain.invalidate(); } 

创build两个不同的XML文件,并根据您的适配器中的位置膨胀,如下所示。

 if(position%2==0){ //Inflate Even number layout with 4 images }else{ //Inflate ODD number layout with 2 images } 

您是否在与StaggeredGridLayoutManager的组合中尝试使用RecyclerView ?

这种组合的结果是这样的: video 。

我想,这就是你要找的。

尝试这个 ,

https://github.com/etsy/AndroidStaggeredGrid

交错网格视图,

非常简单,易于使用。

使用Expandable列表视图,并为每一行提供不同的视图。

http://developer.android.com/reference/android/widget/ExpandableListView.html