Une question rapide:
Dans ListView
j'utilise ce code:
list.addHeaderView(headerView);
Comment faire face à cela lorsque vous travaillez sur gridview
?
Merci.
Il n'y a pas de support pour les vues d'en-tête ou de pied de page avec GridView
, désolé.
Il existe une bonne implémentation de la grille de la GridView avec la prise en charge de l'en-tête dans Google Photos Application, car c'est le code OSS, vous pouvez l'utiliser tel quel ou le prendre comme référence pour votre propre implémentation: http://grepcode.com/file /repository.grepcode.com/java/ext/com.google.Android/android-apps/4.3_r2.1/com/android/Photos/views/headerGridView.java =====
L'idée de base est assez simple - wrapberadapter crée une fausse ligne en augmentant le nombre d'éléments par nombre de colonnes, puis renvoyez une vue d'en-tête pour l'élément.
Exemple de code:
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);
Buildle Build :.
compile 'in.srain.cube:grid-view-with-header-footer:1.0.12'
Vous pouvez utiliser ceci. Le pied de page apparaît/se cache au bas de la grille lorsque vous atteignez/laissez le dernier nombre d'éléments. Il ne fait pas défiler en fait, mais je remarque à peine la différence.
Dans votre activité/fragment d'ONCreate/OnCreateView, vous ajoutez un Onscrolllistener à la 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) {
}
});
Votre mise en page devrait ressembler à quelque chose comme ci-dessous. Notez le paramètre Layout_weight (and Layout_Height) dans la grilleView, il est nécessaire de faire le bon espace pour le pied de page lorsqu'il devient 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>
Que diriez-vous de vérifier l'élément d'index "0" de votre adaptateur? Vous pouvez gonfler la vue personnalisée pour le premier.
@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
Je ne l'ai pas testé, mais devrait travailler.
Vous devriez utiliser une liste de réception, puis faire chaque ligne de la liste ressemble à celle d'une rangée d'une grille. Donc, si vous avez une grille de 3 colonnes, vous feriez une mise en page pour la liste de liste qui ressemble à 3 colonnes. Vous devez alors modifier certains aspects de l'adaptateur pour le faire fonctionner afin que chaque ligne ListView représente réellement 3 lignes de données - de sorte que vous sachiez, getcount ()/3 types de types.
Vous pouvez utiliser asymétricgridView et spécifier des en-têtes/des pieds de page avec un gros rang de rangement afin de prendre toute la ligne.
Pourquoi ne changez-vous pas l'apparence des cellules pour les premières lignes? Si vous savez combien de colonnes vous avez, vous savez combien d'articles apparaîtront dans l'en-tête = nombre de colonnes.Il fonctionne pour moi
Vous pouvez utiliser cette bibliothèque, http://tonicartos.github.io/stickygridheaders/
ce qui vous permet de créer des en-têtes collants (pour regrouper la liste et en gardant l'en-tête visible pour le groupe actuel). Vous pouvez également éteindre la fonctionnalité collante.
Il existe un moyen d'accomplir la fonctionnalité souhaitée sans utiliser de bibliothèque ni de rien.
EDIT: Juste emprunter la mise en œuvre de HeaderGridView par Google, voir ICI
[.____] Vous pouvez également le personnaliser pour le pied de page. La suggestion ci-dessous est trop compliquée et nécessitait plus de peaufine. Sans entrer dans des détails spécifiques, tout ce que vous avez à faire est celui-ci.
1) grille de sous-classe
[.____] 2) Remplacer l'échographie
[.____] 3) calculer le décalage chaque fois qu'il fait défiler
[ défilement.
[.____] 5) Évidemment, vous voulez structurer cela bien afin que votre grille puisse avoir une méthode comme AttachtogridView (vue Affichage). J'ai une implémentation complète de cela qui fonctionne.
Voir Décalage de défilement de GridView Pour obtenir de l'aide sur la mise en décalage, car le gridview a un bogue était le point de vue recyclé.