est-il possible d'obtenir une vue d'élément basée sur sa position dans l'adaptateur et non dans les vues visibles de la liste de réception? P>
Je suis au courant des fonctions telles que GetChildat () et getItemidatSosition (). Toutefois, ils fournissent des informations basées sur les vues visibles à ListView. Je suis également conscient que Android recycle des vues qui signifie que je ne peux que travailler avec les vues visibles dans la liste de réception. p>
Mon objectif est d'avoir un identifiant universel pour chaque élément puisque j'utilise Cursoradapter, donc je n'ai pas à calculer la position de l'élément par rapport aux éléments visibles. P>
5 Réponses :
Une meilleure option consiste à identifier l'utilisation des données renvoyées par le cursoradapter plutôt que sur des vues visibles. Par exemple, si vos données sont dans une matrice, chaque élément de données a un index unique. P>
Y a-t-il une fonction particulière que je peux utiliser? Je lis la liste complète des fonctions de cursoradapter, mais aucune d'entre elles ne semble avoir la vue basée sur ID à distance de GeveView () qui n'est pas recommandée à utiliser à l'extérieur.
Quelle est la structure de données que vous utilisez pour peupler la liste?
Je peuplique la liste d'une base de données SQLite via Cursoradapter
J'ai fini par utiliser getfirstSvisiblePosition (). Apparemment, il renvoie l'élément d'élément par rapport à la liste complète et non seulement des vues visibles. Je calcule ensuite la position de l'article que je voulais en fonction de cela. Merci.
Voici comment j'ai accompli cela. Dans ma classe d'adaptateur (personnalisé): essentiellement l'astuce consiste à définir et à récupérer l'index de position via le voir aussi Ce tutoriel pour des exemples en profondeur. Faites-moi savoir si vous avez besoin de moi pour clarifier quoi que ce soit. P> p> Setg code> et
getTag code> méthodes . Les éléments
(code> variable font référence à la liste code> contenant mes objets personnalisés (adaptateur). P>
J'ai pensé à cette approche. Dans Cursoradapter Bindview remplace GeditView, j'ai tenté de définir une balise pour chaque vue à l'aide de ce code: ID.SetText (curseur.getstring (curseur.getcolumnIdExardRow ("ID"))); Cependant, pour une raison quelconque, l'identifiant était chaque autre numéro au lieu d'être continu. Quoi qu'il en soit, je vais examiner mon code sur la base de l'exemple que vous avez fourni.
Voir ci-dessous Code:
public static class ViewHolder { public TextView nm; public TextView tnm; public TextView tr; public TextView re; public TextView membercount; public TextView membernm; public TextView email; public TextView phone; public ImageView ii; } class ImageAdapter extends ArrayAdapter<CoordinatorData> { private ArrayList<CoordinatorData> items; public FoodDriveImageLoader imageLoader; public ImageAdapter(Context context, int textViewResourceId,ArrayList<CoordinatorData> items) { super(context, textViewResourceId, items); this.items = items; } public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder = null; if (v == null) { try { holder=new ViewHolder(); LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader = new FoodDriveImageLoader(FoodDriveModule.this); v = vi.inflate(R.layout.virtual_food_drive_row, null); //System.out.println("layout is null......."); holder.nm = (TextView) v.findViewById(R.id.name); holder.tnm = (TextView) v.findViewById(R.id.teamname); holder.tr = (TextView) v.findViewById(R.id.target); holder.re = (TextView) v.findViewById(R.id.received); holder.membercount = new TextView(FoodDriveModule.this); holder.membernm = new TextView(FoodDriveModule.this); holder.email = new TextView(FoodDriveModule.this); holder.phone = new TextView(FoodDriveModule.this); holder.ii = (ImageView) v.findViewById(R.id.icon); v.setTag(holder); } catch(Exception e) { System.out.println("Excption Caught"+e); } } else { holder=(ViewHolder)v.getTag(); } CoordinatorData co = items.get(position); holder.nm.setText(co.getName()); holder.tnm.setText(co.getTeamName()); holder.tr.setText(co.getTarget()); holder.re.setText(co.getReceived()); holder.ii.setTag(co.getImage()); imageLoader.DisplayImage(co.getImage(), FoodDriveModule.this , holder.ii); if (co != null) { } return v; } }
Ici, son code décrit très court, vous pouvez simplifier la réutilisation du modèle de visualisation pour augmenter la performance de la liste de réception. Écrivez ci-dessous le code dans votre méthode GeveView ()
ViewHolder holder = new ViewHolder(); if (convertView == null) { convertView = layoutInflater.inflate(R.layout.skateparklist, null); holder = new ViewHolder(); holder.headlineView = (TextView) convertView .findViewById(R.id.textView1); holder.DistanceView = (TextView) convertView .findViewById(R.id.textView2); holder.imgview = (NetworkImageView) convertView .findViewById(R.id.imgSkatepark); convertView.setTag(holder); //PLEASE PASS HOLDER AS OBJECT PARAM , CAUSE YOU CAN NOY PASS POSITION IT WILL BE CONFLICT Holder and Integer can not cast //BECAUSE WE NEED TO REUSE CREATED HOLDER } else { holder = (ViewHolder) convertView.getTag(); } // your controls/UI setup holder.DistanceView.setText(strDistance); ...... return convertview
Listview lv = (ListView) findViewById(R.id.previewlist); final BaseAdapter adapter = new PreviewAdapter(this, name, age); confirm.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub View view = null; String value; for (int i = 0; i < adapter.getCount(); i++) { view = adapter.getView(i, view, lv); Textview et = (TextView) view.findViewById(R.id.passfare); value=et.getText().toString(); Toast.makeText(getApplicationContext(), value, Toast.LENGTH_SHORT).show(); } } });