How to get view for an item in listview in android?

前端 未结 5 2133
南方客
南方客 2020-12-16 17:26

Is it possible to get an item view based on its position in the adapter and not in the visible views in the ListView?

I am aware of functions like getChildAt() and g

相关标签:
5条回答
  • 2020-12-16 17:39

    See below 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;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-16 17:39

    A better option is to identify using the data returned by the CursorAdapter rather than visible views. For example if your data is in a Array , each data item has a unique index.

    0 讨论(0)
  • 2020-12-16 17:42

    Here's how I accomplished this. Within my (custom) adapter class:

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

    Essentially the trick is to set and retrieve the position index via the setTag and getTag methods. The items variable refers to the ArrayList containing my custom (adapter) objects.

    Also see this tutorial for in-depth examples. Let me know if you need me to clarify anything.

    0 讨论(0)
  • 2020-12-16 17:52

    Here, Its very short described code, you can simple re-use viewholder pattern to increase listview performance Write below code in your getview() method

    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 讨论(0)
  • 2020-12-16 17:55
    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();
                }
    
    
    
            }
        });
    
    0 讨论(0)
提交回复
热议问题