如何在android的listview中获取项目的视图?

Posted

技术标签:

【中文标题】如何在android的listview中获取项目的视图?【英文标题】:How to get view for an item in listview in android? 【发布时间】:2012-01-31 08:56:57 【问题描述】:

是否可以根据其在适配器中的位置而不是在 ListView 的可见视图中获取项目视图?

我知道诸如 getChildAt() 和 getItemIdAtPosition() 之类的函数,但是它们根据 ListView 中的可见视图提供信息。我也知道 android 会回收视图,这意味着我只能使用 ListView 中的可见视图。

我的目标是为每个项目设置一个通用标识符,因为我使用的是 CursorAdapter,因此我不必计算项目相对于可见项目的位置。

【问题讨论】:

【参考方案1】:

这就是我如何做到这一点的。在我的(自定义)适配器类中:

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

本质上,诀窍是通过setTaggetTag 方法设置和检索位置索引。 items 变量是指包含我的自定义(适配器)对象的 ArrayList

另请参阅this 教程以获取深入示例。如果您需要我澄清任何事情,请告诉我。

【讨论】:

我想到了这种方法。在 CursorAdapter bindView 替换 getView 中,我尝试使用以下代码为每个视图设置一个标签:id.setText(cursor.getString(cursor.getColumnIndexOrThrow("id")));但是,由于某种原因,id 是每隔一个数字而不是连续的。无论如何,我会根据您提供的示例来审核我的代码。【参考方案2】:

见以下代码:

 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;
    


【讨论】:

【参考方案3】:

更好的选择是使用 CursorAdapter 返回的数据而不是可见视图来识别。 例如,如果您的数据在 Array 中,则每个数据项都有一个唯一索引。

【讨论】:

有什么特别的功能可以使用吗?我阅读了 CursorAdapter 函数的完整列表,但除了不建议在外部使用的 getView() 之外,它们似乎都没有基于 id 获取视图。 您用来填充列表的数据结构是什么? 我通过 CursorAdapter 从 Sqlite 数据库中填充列表 我最终使用了 getFirstVisiblePosition()。显然,它返回相对于整个列表的项目 ID,而不仅仅是可见视图。然后我根据此计算我想要的项目的位置。谢谢。【参考方案4】:

这里,它描述的代码非常简短,你可以简单地重用视图模式来提高列表视图的性能 在您的 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

【讨论】:

【参考方案5】:
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();
            



        
    );

【讨论】:

以上是关于如何在android的listview中获取项目的视图?的主要内容,如果未能解决你的问题,请参考以下文章

Android Sqlite:如何从 Listview 中获取 SQLite rowId?

如何从android的listview中的不同项目获取数据

android - listview 按位置获取项目视图

如何在android中获取特定列表视图项目的ID?

android listview 获取所选项目

在 Android ListVIew 的位置获取项目