View类型对象的setTag()和getTag()等方法的主要目的是什么?

我认为我可以将任意数量的对象与单个视图相关联是正确的吗?


当前回答

对于web开发人员来说,这似乎相当于数据-..

其他回答

当你有一个ListView并且想要回收/重用视图时,TAGs的设置非常有用。这样,ListView变得非常类似于更新的RecyclerView。

@Override
public View getView(int position, View convertView, ViewGroup parent)
  {
ViewHolder holder = null;

if ( convertView == null )
{
    /* There is no view at this position, we create a new one. 
       In this case by inflating an xml layout */
    convertView = mInflater.inflate(R.layout.listview_item, null);  
    holder = new ViewHolder();
    holder.toggleOk = (ToggleButton) convertView.findViewById( R.id.togOk );
    convertView.setTag (holder);
}
else
{
    /* We recycle a View that already exists */
    holder = (ViewHolder) convertView.getTag ();
}

// Once we have a reference to the View we are returning, we set its values.

// Here is where you should set the ToggleButton value for this item!!!

holder.toggleOk.setChecked( mToggles.get( position ) );

return convertView;
}

与id不同,标记不用于标识视图。标签本质上是可以与视图相关联的额外信息。它们最常用来方便地在视图本身中存储与视图相关的数据,而不是将它们放在一个单独的结构中。

参考:http://developer.android.com/reference/android/view/View.html

我们可以根据需要使用setTag()和getTag()来设置和获取自定义对象。setTag()方法接受一个Object类型的参数,getTag()返回一个Object。

例如,

Person p = new Person();
p.setName("Ramkailash");
p.setId(2000001);
button1.setTag(p);

对于web开发人员来说,这似乎相当于数据-..

这对于使用自定义ArrayAdapter非常有用。这是一种优化。那里setTag被用作引用对象,引用布局的某些部分(显示在ListView中),而不是findViewById。

static class ViewHolder {
    TextView tvPost;
    TextView tvDate;
    ImageView thumb;
}

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inflater = myContext.getLayoutInflater();
        convertView = inflater.inflate(R.layout.postitem, null);

        ViewHolder vh = new ViewHolder();
        vh.tvPost = (TextView)convertView.findViewById(R.id.postTitleLabel);
        vh.tvDate = (TextView)convertView.findViewById(R.id.postDateLabel);
        vh.thumb = (ImageView)convertView.findViewById(R.id.postThumb);
        convertView.setTag(vh);
    }
            ....................
}