web-dev-qa-db-fra.com

Comment obtenir la vue pour un élément dans listview dans Android?

Est-il possible d'obtenir une vue d'élément en fonction de sa position dans l'adaptateur et non dans les vues visibles dans ListView?

Je connais des fonctions telles que getChildAt () et getItemIdAtPosition (), mais elles fournissent des informations basées sur les vues visibles dans ListView. Je suis également conscient du fait qu'Android recycle les vues, ce qui signifie que je ne peux utiliser que les vues visibles dans ListView.

Mon objectif est d'avoir un identifiant universel pour chaque élément, car j'utilise CursorAdapter, de sorte que je n'ai pas à calculer la position de l'élément par rapport aux éléments visibles.

12
Kalimah Apps

Voici comment j'ai accompli ceci. Dans ma classe d'adaptateur (personnalisée):

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view = null;
  if (convertView == null) {
    LayoutInflater inflater = context.getLayoutInflater();
    view = inflater.inflate(textViewResourceId, parent, false);
    final ViewHolder viewHolder = new ViewHolder();
    viewHolder.name = (TextView) view.findViewById(R.id.name);
    viewHolder.button = (ImageButton) view.findViewById(R.id.button);

    viewHolder.button.setOnClickListener
      (new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        int position = (int) viewHolder.button.getTag();
        Log.d(TAG, "Position is: " +position);
      }
    });

    view.setTag(viewHolder);
    viewHolder.button.setTag(items.get(position));

  } else {
    view = convertView;
    ((ViewHolder) view.getTag()).button.setTag(items.get(position));
  }


  ViewHolder holder = (ViewHolder) view.getTag();

  return view;
}

Le truc consiste essentiellement à définir et à récupérer l'index de position via les méthodes setTag et getTag. La variable items fait référence à la ArrayList contenant mes objets personnalisés (adaptateur).

Voir également this tutorial pour des exemples détaillés. Faites-moi savoir si vous avez besoin de moi pour clarifier quelque chose.

8
Marvin Pinto

Puisse-t-il vous être utile. Voir le code ci-dessous:

 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;
    }

}

Profitez. Merci.

3
iDroid Explorer

Une meilleure option consiste à identifier à l'aide des données renvoyées par CursorAdapter plutôt que par des vues visibles. Par exemple, si vos données se trouvent dans un tableau, chaque élément de données a un index unique.

1
Rajdeep Dua
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();
            }



        }
    });
1
arjun

Ici, son code très court décrit, vous pouvez simplement réutiliser un modèle de détenteur de vue pour augmenter les performances de listview Écrire le code ci-dessous dans votre méthode getview ()

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
0
Kirtikumar A.