android - simbolos - ¿Puede un GridView tener un pie de página y un encabezado al igual que ListView?
numero de paginas google docs (11)
Una pregunta rápida:
En ListView
yo uso este código:
list.addHeaderView(headerView);
¿Cómo lidiar con eso cuando se trabaja en gridview
?
Gracias.
¿Por qué no cambias la apariencia de las celdas para las primeras filas? Si sabe cuántas columnas tiene, sabe cuántos elementos aparecerán en el encabezado = número de columnas. Funciona para mí
¿Qué hay de verificar el elemento de índice "0" en su adaptador? Puedes inflar la vista personalizada para la primera.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if(view==null){
if(position==0){
// ...inflate header view
}else{
// ...do as usual
No lo he probado, pero debería funcionar.
Hay una implementación bastante buena de GridView con soporte de encabezado en la aplicación Google Photos, ya que es un código OSS que puede usar como está o tomarlo como referencia para su propia implementación: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.3_r2.1/com/android/photos/views/HeaderGridView.java
La idea básica es bastante simple: WrapperAdapter crea una fila falsa aumentando el número de elementos por número de columnas y luego devuelve una vista de encabezado para el elemento.
Hay una manera de lograr la funcionalidad deseada SIN usar una biblioteca ni nada.
EDITAR: Simplemente tome prestada la implementación de HeaderGridView de Google, vea Here
También puedes personalizarlo para pie de página. La siguiente sugerencia es demasiado complicada y requiere más ajustes. Sin entrar en detalles específicos, todo lo que necesita hacer es esto.
1) Subclase GridView
2) anular onScrollChanged
3) Calcular el desplazamiento cada vez que se desplaza
4) Establezca la traducción parentView (vista que contiene el headerView y gridview) y en -Offset. (View.setTranslationY (-offset). También tenga una declaración if para que una vez que alcance un cierto desplazamiento se detenga el desplazamiento.
5) obviamente desea estructurar esto bien para que su vista de cuadrícula pueda tener un método como attachToGridview (vista de vista). Tengo una implementación completa de esto que funciona.
Consulte Desplazamiento de desplazamiento de GridView para obtener ayuda sobre cómo obtener un desplazamiento ya que GridView tiene un error donde las vistas se reciclan.
No hay soporte para las vistas de encabezado o pie de página con GridView
, lo siento.
Puede usar AsymmetricGridView y especificar encabezados / pies de página con un rowSpan más grande para que tomen toda la fila.
Puede usar esta biblioteca, http://tonicartos.github.io/StickyGridHeaders/
que le permite crear encabezados que son pegajosos (para agrupar la lista y mantener el encabezado visible para el grupo actual). También puede desactivar la función adhesiva.
Puedes usar esto. El pie de página aparece / se oculta en la parte inferior de la cuadrícula cuando alcanza / deja el último número de elementos. En realidad no se desplaza, pero casi no noto la diferencia.
En su actividad / fragmento en onCreate / onCreateView usted agrega un OnScrollListener a GridView:
....
GridView gridview = (YMAnimatedGridview) v.findViewById(R.id.my_gridview);
gridview.setAdapter(adapter);
final View footerView = mainView
.findViewById(R.id.my_grid_footer_view);
gridview.setOnScrollListener(new GridView.OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (firstVisibleItem + visibleItemCount == totalItemCount) {
// last item in grid is on the screen, show footer:
footerView.setVisibility(View.VISIBLE);
} else if (footerView.getVisibility() != View.GONE) {
// last item in grid not on the screen, hide footer:
footerView.setVisibility(View.GONE);
}
}
@Override
public void onScrollStateChanged(AbsListView view,
int scrollState) {
}
});
Su diseño debe ser similar al siguiente. Observe el parámetro layout_weight (y layout_height) en la vista de cuadrícula, es necesario para hacer el espacio correcto para el pie de página cuando se hace visible.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:id="@+id/my_gridview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:columnWidth="160dp"
android:gravity="center_horizontal"
android:horizontalSpacing="12dp"
android:numColumns="auto_fit"
android:layout_weight="1"
android:stretchMode="columnWidth"
android:verticalSpacing="6dp" />
<TextView
android:id="@+id/my_grid_footer_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginBottom="8dp"
android:orientation="horizontal"
android:visibility="gone"
android:text="footer text here" >
</TextView>
</LinearLayout>
Tendría que usar un ListView, y luego hacer que cada fila de la lista se vea como si fuera realmente una fila de una cuadrícula. Entonces, si tienes una cuadrícula de 3 columnas, harías un diseño para el ListView que se parece a 3 columnas. Luego tendría que modificar ciertos aspectos del Adaptador para que funcione, de modo que cada fila de ListView represente realmente 3 líneas de datos, para que sepa, escriba GetCount () / 3.
Código de muestra:
GridViewWithHeaderAndFooter gridView = (GridViewWithHeaderAndFooter) v.findViewById(R.id.ly_image_list_grid);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View headerView = layoutInflater.inflate(R.layout.test_header_view, null);
View footerView = layoutInflater.inflate(R.layout.test_footer_view, null);
gridView.addHeaderView(headerView);
gridView.addFooterView(footerView);
Construcción de Gradle:.
compile ''in.srain.cube:grid-view-with-header-footer:1.0.12''
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<com.test.Breadcrumbs android:layout_width="fill_parent" android:layout_height="100dp" />
<GridView
android:id="@+id/grid"
android:numColumns="auto_fit"
android:gravity="center"
android:stretchMode="columnWidth"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp">
</GridView>
</LinearLayout>
y migas de pan:
public class Breadcrumbs extends LinearLayout {
public Breadcrumbs(final Context context, final AttributeSet attrs) {
super(context, attrs);
final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutView = inflater.inflate(R.layout.breadcrumbs, this, true);
funciona bien, el desplazamiento para la cuadrícula funciona también.