Cómo establecer diferentes columnas para filas en android gridview
Quiero tener una gridview similar a esta
- GridView, GridLayout o TableLayout?
- Android gridview expandir animación de elementos
- ConvertView se pasa como null incluso si la vista existe
- Efecto de ondulación en la parte superior de la imagen - Android
- Hacer cuadrados los elementos de GridView
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?
- Picasso "Cambiar tamaño y centerCrop" o ImageView "centerCrop"?
- Pasar de una vista de lista a una vista de cuadrícula
- Cómo especificar android: listSelector = "@ null" mediante programación?
- Android obtener la posición del elemento seleccionado en gridview
- GridView carga lento para los recursos de imagen grande
- BaseAdapter y ContextMenu
- El clic de GridView no funciona dentro de la vista de lista personalizada
- AQuery (Android Query) Cómo cargar imágenes en realidad
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,
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
No es cómo funciona en mi proyecto tengo altura diferente de las células y también el encabezado
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
- Selección de recursos de Android y valores e inconsistencias
- Google Maps V2 – Error al inflar la clase Fragmento