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

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

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

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

【问题讨论】:

    标签: java android android-layout android-listview


    【解决方案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();
                    }
        
        
        
                }
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-08
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多