Cómo establecer diferentes columnas para filas en Android gridview

Quiero tener una vista de cuadrícula similar a esta

enter image description here

Cada fila impar tendrá dos imágenes de gran tamaño e incluso las filas numeradas tendrán cuatro imágenes más pequeñas. ¿Cómo puedo lograr esto?

Tengo algo similar y lo resolví con el nuevo RecyclerView.

Creé un Fragmento con un RecyclerView . RecyclerView en xml:

  

En su Fragmento / Actividad (OnViewCreated en mi caso fragmento). Encuentro RecyclerView y configuré un Adaptador, una clase de Adaptador normal hereda de RecyclerView.Adapter VISITANTE >> Y luego creo un GridLayoutManager

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

Luego anulo este método para establecer un número dynamic de columnas (celdas)

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

Con esto obtendrás números dynamics de celdas en tus filas.

EXTRA: Entonces, si está utilizando la misma vista / tipo de vista en su adaptador, obtendrá la misma vista de w & h. Deberá crear 2 vistas xml para TYPE_HIGH y otra vista para TYPE_LOW.

Entonces, en su adaptador, necesita tener 2 tipos de datos (1 para imágenes altas y 1 para imágenes bajas). Debe anular estos métodos

 @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; } 

Espero haber sido claro, cualquier problema dime.

En lugar de considerar una sola vista de imagen, tomo un grupo de tres imágenes como un único elemento de la cuadrícula,

enter image description here

prueba esto dentro de tu adaptador de red

         

y su vista de cuadrícula sería como

   

Lo único que tienes que cuidar es la secuencia de tu imagen. podría ser esto te ayudará

Si está utilizando RecyclerView para GridView , entonces hay una solución que debería funcionar para usted:

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

Espero que este trabajo para ti!

Supongo que la mejor manera de hacerlo es usar la vista de reciclador. También es preferible a la lista / cuadrícula para el rendimiento

Puede estar debajo de los enlaces que pueden ayudar mucho – Todos están relacionados con la Vista bidireccional de Lucas

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

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

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

Hay cómo funciona en mi proyecto tengo diferentes alturas de celdas y también cabecera

enter image description here

adaptador:

 public class AdapterRecViewMain extends RecyclerView.Adapter { private List mainCardList; private final int HEADER_VIEW = 0; private final int FOOTER_VIEW = 1; public AdapterRecViewMain() { } public void setData(List 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); } } } 

En tu actividad:

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

Cree dos archivos XML diferentes e infle según la posición en su Adaptador, como se muestra a continuación.

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

¿ Probaste un RecyclerView en una combinación con un StaggeredLridLayoutManager ?

Esta combinación da como resultado algo como esto: video .

Creo que esto es lo que estás buscando.

Prueba esto ,

https://github.com/etsy/AndroidStaggeredGrid

Vista de cuadrícula escalonada,

Extremadamente simple, fácil de usar.

Use la vista de lista ampliable y proporcione una vista diferente para cada fila.

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