Ajouter / Supprimer un en-tête et pied de page dynamiquement
J'ai besoin d'être en mesure d'ajouter et de supprimer des en-têtes et pieds de page de mon ListView
de façon dynamique.
Si j'initialise mon activité avec mon les en-têtes et pieds de page, puis à un certain point, je tiens à les cacher, et plus tard, j'ai besoin d'ajouter de la précédente en-têtes et pieds de page, et garder la même Adapter
.
J'ai donc trouvé cette solution, mais c'est moche et j'espère vraiment qu'il y est une autre manière.
En gros, je dois mettre un adaptateur null pour être en mesure d'ajouter l'en-tête de la vue, puis définissez un vide adaptateur pour ajouter le pied de page vue. Pour finir, j'ai mis mon vrai carte.
Edit: je dois ajouter que l'utilisation de l'attribut visibility (PARTI & VISIBLE) n'est pas une solution, parce que les en-têtes et pieds de pages vues ne doit pas être dans l'adaptateur lors de ma procédure intermédiaire.
public class TestAdapterHeader extends ListActivity implements OnClickListener {
private static String[] items = { "test 1", "test 2", "test 3", "test 4",
"test 5", "test 6", "test 7", "test 8", "test 9", "test 10",
"test 11", "test 12", "test 13", "test 14", "test 15", "test 16",
"test 17", "test 18", "test 19", "test 20" };
private ArrayAdapter mAdapter;
private LinearLayout mParentView;
private TextView mHeaderView, mFooterView;
private boolean mViewsHidden = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initViews();
mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items);
setListAdapter(mAdapter);
}
private void initViews() {
//The main layout
mParentView = new LinearLayout(this);
mParentView.setOrientation(LinearLayout.VERTICAL);
mParentView.setBackgroundColor(Color.BLACK);
//The button to hide the views
Button hideViewsButton = new Button(this);
hideViewsButton.setText("Add/Remove views");
hideViewsButton.setOnClickListener(this);
//The listview
ListView listView = new ListView(this);
listView.setId(android.R.id.list);
listView.setCacheColorHint(Color.TRANSPARENT);
mParentView.addView(hideViewsButton);
mParentView.addView(listView);
//Set the content view
setContentView(mParentView);
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 150);
mHeaderView = new TextView(this);
mHeaderView.setTextColor(Color.WHITE);
mHeaderView.setBackgroundColor(Color.BLUE);
mHeaderView.setGravity(Gravity.CENTER);
mHeaderView.setLayoutParams(lp);
mHeaderView.setText("Header");
mFooterView = new TextView(this);
mFooterView.setTextColor(Color.WHITE);
mFooterView.setBackgroundColor(Color.BLUE);
mFooterView.setGravity(Gravity.CENTER);
mFooterView.setLayoutParams(lp);
mFooterView.setText("Footer");
getListView().addHeaderView(mHeaderView);
getListView().addFooterView(mFooterView);
}
@Override
public void onClick(View v) {
mViewsHidden = !mViewsHidden;
//Remove header & footer views
if (mViewsHidden) {
getListView().removeHeaderView(mHeaderView);
getListView().removeFooterView(mFooterView);
}
else {
//Remove the ListAdapter to be able to add our headerView
setListAdapter(null);
getListView().addHeaderView(mHeaderView);
//Set an empty ListAdapter to be able to add our footerView
setListAdapter(new ArrayAdapter<String>(TestAdapterHeader.this, -1));
getListView().addFooterView(mFooterView);
//Re set our Adapter
setListAdapter(mAdapter);
}
mParentView.requestLayout();
}
}
Non, je n'ai rien trouvé de plus intelligent que la solution que j'ai donné. Mais au moins ça marche.
OriginalL'auteur Chayy | 2012-02-29
Vous devez vous connecter pour publier un commentaire.
N'essayez pas d'ajouter/supprimer l'en-tête/pied de page vue.
Pour être en mesure d'ajouter/supprimer un en-tête et pied de page afficher dynamiquement, il suffit d'ajouter avant le réglage de l'adaptateur, un RelativeLayout à en-tête et pied de page.
Après cela, vous pouvez ajouter/supprimer ce que jamais vous voulez le RelativeLayouts.
Définir la taille de la RelativeLayouts à WRAP_CONTENT.
Harry
OriginalL'auteur Harry
Vous pouvez utiliser le code ci-dessous à faire de même
votre hack fonctionne pour la plupart des appareils et les systèmes d'exploitation et vous pourriez être coincé avec elle. Cependant, j'ai découvert la manière dure setListAdapter(null); & getListView().addHeaderView(mHeaderView); ne fonctionne pas sur 2.3.5 de manière fiable (plus Précisément droid 3 téléphone). Par conséquent, la définition de la visibilité peut être votre meilleure option, même si vous ne l'aimez pas.
Ne fonctionne pas sur la 4.4
OriginalL'auteur Maneesh
J'ai juste eu ce problème et voici ce que j'ai fait. Ajouter une balise à la vue de trouver et de supprimer par la balise.
OriginalL'auteur Kevin Kohler
Vous devez utiliser
view.setVisibility(int visibility)
Vue.DISPARU de la Vue.VISIBLE ou de la Vue.INVISIBLEOriginalL'auteur Vyacheslav Shylkin
vous avez besoin d'ajouter des pieds de page et en-têtes de vues en liste avant de la setAdapter et après cela, vous pouvez manipuler avec setVisibility
bonne chance 😉
OriginalL'auteur ademar111190
Ce qui semble être l'une des rares solutions. J'ai juste essayé quelque chose de très similaire et cela a fonctionné, mais je suis dans le même bateau. Pour moi, il se sent comme un hack.
Il y a quelques autres options, comme le manuellement ajouter/supprimer/masquer l'en-tête/pied de page dans la vue à l'extérieur de la listview. Cependant, vous ne pouvez pas obtenir le bon effet de défilement qui est à peu près le point de listview en-tête.
J'ai juste essayé la définition d'une vue à Afficher.DISPARU et à la place de la vue de fuite, il y a un écart au sommet de la liste.
OriginalL'auteur Joe Plante
J'ai trouvé un travail autour de cette situation, bien que la plupart ne peuvent pas ça. Il suffit d'ajouter une disposition linéaire au-dessus et au-dessous de la vue de liste. Maintenant, vous pouvez ajouter et supprimer dynamiquement des points de vue avec l'option d'utiliser les options de visibilité. Si vous réglez les paramètres de WRAP_CONTENT, puis la mise en page prendra pas de place si il n'y a pas d'enfants.
Listview intégré dans l'en-tête ne sont pas faites défiler jusqu'à l'affichage de la liste, soit autant que je me souvienne. Pourquoi ne pouvez-vous pas insérer l'en-tête, sans aucune information et de modifier son contenu ou de la visibilité au moment de l'exécution? Vous dites que vous ne pouvez pas les avoir là, mais je ne sais pas pourquoi.
Eh bien, mon ListView peut être définie dans un mode d'édition, où je peux réorganiser et supprimer les éléments. Pour faire cette opération, je dois supprimer les en-têtes et pieds d'abord, puis de laisser l'utilisateur modifie la liste, et quand il quitte le mode d'édition, j'ai re ajouter les en-têtes/pieds de page. Peut-être le moyen le plus propre serait d'adapter ce mode d'édition d'ignorer les en-têtes et pieds de page...
Ouais, je pense que ce serait facile de simplement ignorer l'index 0 et la taille de l'index - 1.
OriginalL'auteur Slynk
J'ai eu le même problème - j'ai dû dynamiquement ajouter ou supprimer des en-tête et je l'ai fait de cette façon:
- J'ai enlevé les éléments de l'adaptateur et de définir
adapter=null;
- Pour l'élimination: r
emoveHeaderView(mHeaderView);
- Pour l'ajout d'en-tête:
addHeaderView(mHeaderView);
- créer de l'adaptateur de nouveau et de définir le contenu
Il fonctionne, mais sans animation il semble laid
OriginalL'auteur romeksd
OriginalL'auteur Mobeen Altaf
Elle est très simple!
1) Fournir et id à la disposition de conteneurs de vous de bas de page.
Ex.
footer.xml
Dans le xml ci-dessus, parent_footer_search_list est votre principal numéro du conteneur.
Maintenant, nous allons revenir à votre fragment/activité où vous avez gonflé ce pied de page.
Donc, afin de le supprimer,
Fait! De cette façon, vous êtes à l'utilisation correcte des android normes. Ne pas à l'aide de wrap_content, la visibilité DISPARU, etc. Ils sont juste hacks !
OriginalL'auteur Abhilash
Essayer en utilisant la liste.addFooterView(footerview) pour le pied de page et la liste.addHeaderView(headerview) pour l'en-tête.
OriginalL'auteur Anand.B