Ajouter le fragment dans l'élément listview
Je veux avoir un fragment de chaque élément dans une liste, parce que je veux séparer la logique. Je suis l'aide d'une vue titulaire pour chaque élément. Si la vue n'existe pas, j'ai créer un nouveau fragment et l'ajouter dans le récipient.
holder.mMyFragment = new MyFragment(mActivity, this);
mActivity.getSupportFragmentManager().beginTransaction().add(R.id.my_container, holder.mMyFragment).commit();
Également pour chaque élément, j'appelle titulaire.mMyFragment.setUi(source de données, position) pour définir l'INTERFACE utilisateur du fragment sur la base des données de la source et de la position.
Le problème que je rencontre est que je initialiser les éléments de l'INTERFACE utilisateur de fragment dans onCreateView méthode du fragment de la classe, mais il n'est pas appelé quand j'ai ajouter le fragment de l'élément. Plus tard, quand je l'appelle setUi() qui utilise certains éléments de l'INTERFACE du fragment, il se plaint d'une NullPointerException. Quelqu'un aurait-il une suggestion? Merci!
- Il est tard mais @Brabbeldas me demander comment je l'ai eu, j'ai donc mis à jour ma réponse. Je suis de l'utiliser dans une application privée.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser le fragment comme élément d'une liste de points de vue, parce que l'API ne vous permet pas de vous -
View
etFragment
ne sont pas liés, même si il n'y a aucun moyen que vous pouvez l'utiliser comme ça. Faire des vues personnalisées et l'utilisation de l'adaptateurgetViewTypeCount
etgetView
à utiliser les différents élément de la liste comportement.Fragment sont gérés par l'Activité FragmentManager ou par d'autres Fragments de l'enfant FragmentManager; tout élément de la liste de vues sont gérées par ListView & ListAdapter. Vous pouvez utiliser les ListViews en Fragments, mais pas l'inverse.
"IL y a UNE SOLUTION" pour cela.
La question est, vous ne peut pas ajouter fragment directement dans le récipient(FrameLayout) avec le même "id" dans la listview que vous avez fait dans le code ci-dessus.
La truc est, de créer des listview(Recyclerview) de "LinearLayout". Puis dynamiquement créer FrameLayout dans l'adaptateur et attribuer différent de l'id de pour chaque. Gonfler Fragment de FrameLayout et ce FrameLayout à LinearLayout.
Une manière simple.
Un seul problème:Vous devez ajouter de restauration fragment de l'état.
Salut, j'ai été confrontée au même problème et j'ai trouvé le moyen de le faire.
Mon problème était semblable à vous:
Dans mon application, je dois donner une option pour afficher les articles personnalisés à la verticale (listView) et horizontale (ViewPager) mode. De plus, j'ai eu à traiter avec 18 articles personnalisés et chacune avec une logique différente, de sorte que la meilleure approche serait de réutiliser les fragments que j'ai utilisé pour ViewPager dans la ListView.
Je l'ai eu, mais pas de la façon que vous avez été d'essayer, je veux dire, j'ai utilisé mon fragments comme "ViewHolders":
getViewTypeCount(), getItemViewType(int position), getCount(), getItem(int position) getView(int position, View convertView, ViewGroup parent)
Dans
getView
j'ai vérifié ce genre de mise en page, j'avais besoin avant de "gonfler" le XML, créer un fragment, d'attribuer un widget à partir de XML au fragment (avecrootView.findViewById
) et réglez le "tag" avec le nouveau fragment.Ce que vous pouvez voir à ce point, c'est que des fragments dans ListView ne l'ai jamais attaché à l'Activité, mais vous avez obtenu ce que vous vouliez: logique distribuée en plusieurs parties et de tous les avantages de la ListView (réutilisation de lignes, de défilement, etc).
Si vous avez besoin je peux poster une partie de mon code, mais vous avez à traiter avec "spanglish" ;).
Mis à JOUR
Tout le problème est que lorsque vous créez un Fragment pour être utilisé avec ViewPager, généralement, toutes les "mises en page et "installation" code à l'intérieur de
onCreateView
méthode, je veux dire:View rootView = inflater.inflate(R.layout.fragment_question_horizontal_container, container, false);
)answer = (EditText)rootView.findViewById(R.id.answer_question_text);
)Jusqu'à ce point, il n'y a rien de bizarre.
Si vous allez utiliser un fragment avec le comportement décrit ci-dessus, vous avez à "imiter" l'appel à onCreateView, remplissez les données et l'attacher à la listView.
L'astuce est là: diviser le code en
onCreateView
dans certaines méthodes qui ne se soucie pas de l'identité de l'appelant eux. Un exemple de mononCreateView
:Maintenant, nous allons aller à la CustomArrayAdapter pour l'affichage de la liste:
PreguntasVerticalArrayAdapter extends ArrayAdapter<Pregunta>
où "la Pregunta" est un générique Fragment de la logique à partir de ci-dessus.getViewTypeCount(), getItemViewType(int position), getCount(), getItem(int position) getView(int position, View convertView, ViewGroup parent)
.La
getView
suivre le même comportement: obtenir l'objet à la position donnée dans les params, la réutilisation d'un "viewholder" et remplissez les données. Voici mongetView
:C'est tout... à ce stade, si vous avez assez d'expérience avec les CustomArrayAdapters et des Fragments que vous avez probablement obtenu! 😀
À partir de l'Android à la Documentation : "Un Fragment représente un comportement ou d'une partie de l'interface utilisateur dans une Activité. Vous pouvez combiner plusieurs fragments dans une activité simple à construire un multi-volet de l'INTERFACE utilisateur et de la réutilisation d'un fragment dans de multiples activités."
Pour votre activité, voulez-vous ajouter 2 fragments où le premier affiche une listView (= ListFragment et l'autre est dans le droit et est affiché uniquement lorsque l'utilisateur clique sur un élément (à partir du premier fragment ou listView) ?