Cómo establecer diferentes columnas para filas en android gridview

Quiero tener una gridview similar a esta

Introduzca aquí la descripción de la imagen

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

Tengo algo similar y he resuelto con el nuevo RecyclerView.

Creé un Fragmento con un RecyclerView . RecyclerView en 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" /> 

En tu Fragmento / Actividad (OnViewCreated en mi caso de fragmento). Encontré el RecyclerView y fijé un adaptador – una clase normal del adaptador heredó de RecyclerView.Adapter <SU clase del SITIO DE LA VISIÓN> – Y entonces creo un GridLayoutManager

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

A continuación, anular este método para establecer un número dinámico 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á números dinámicos de celda en sus filas.

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

Por lo tanto, en tu adaptador, necesitas 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 que haya sido claro, cualquier problema me lo diga.

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

Introduzca aquí la descripción de la imagen

Intente esto dentro de su adaptador de rejilla

 <?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> 

Y su vista de cuadrícula sería como

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

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

Esperamos que este trabajo para usted!

Supongo que la mejor manera de hacer es usar la vista de reciclador .. También se prefiere sobre la lista / rejilla para el rendimiento

Puede estar por debajo de los enlaces pueden ayudar mucho – Todos están relacionados con Dos vías Ver por Lucas

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

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

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

No es cómo funciona en mi proyecto tengo altura diferente de las células y también el encabezado

Introduzca aquí la descripción de la imagen

adaptador:

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

En su 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 basado en la posición en su adaptador como a continuación.

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

¿Has probado un RecyclerView en una combinación con un StaggeredGridLayoutManager ?

Esta combinación resulta en algo como esto: video .

Creo que esto es lo que estás buscando.

Prueba esto ,

https://github.com/etsy/AndroidStaggeredGrid

Escalonada-Grid Vista,

Extremadamente simple, fácil de usar.

Utilice la vista de lista expandible y proporcione una vista diferente para cada fila.

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

  • Problema de desplazamiento de GridView en Android
  • Vista de cuadrícula obtener elementos que son visibles para el usuario
  • No se puede dibujar línea sobre elementos gridview correctamente a través de celdas textview en Android
  • Android: getLocationOnScreen devuelve 0 para imageview dentro de gridview
  • Gridview, permite que el lienzo de fondo dibuje fuera de la vista
  • Ejemplo simple de red de Android con RecyclerView con GridLayoutManager (como el GridView antiguo)
  • Cómo tener un GridView que adapte su altura cuando se agregan elementos
  • Después de onLongPress, la primera vista en gridview obtiene NullPointerException en startDrag
  • Android GridView - actualizar Vista basada en la posición
  • Eliminación del relleno adicional en un GridView en android
  • No se puede crear el menú "Compartir" en el menú emergente de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.