我什么都有,就是没钱

本人的android:qq群:181235811,欢迎大家加入讨论技术问题呀
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

view中的setTag和getTag方法的理解

Posted on 2013-11-30 08:28  我什么都有,就是没钱  阅读(533)  评论(0)    收藏  举报

下面是一段自定义适配器中的getView方法,其中使用了view的一个setTag和getTag方法

  View中的setTag(Onbect)表示给View添加一个格外的数据(相当于缓存),以后可以用getTag()将这个数据取出来。

  下面是继承BaseAdapter的一个自定义适配器中的getView方法的内容,其中就用到了setTag和getTag方法

public View getView(int arg0, View arg1, ViewGroup arg2) {
        // #A 加载
        Log.d(LogUtil.TAG,"enter "+ arg0 + "");
        if (arg1 == null) {
            arg1 = layoutInflater.inflate(R.layout.listview_item, null);
            HoldView holdView = new HoldView(arg1);
            arg1.setTag(holdView); //加载控件
            Log.d(LogUtil.TAG, arg0 + " null -- load");
        }
        // #B 拿到当前的数据
        News news = newsList.get(arg0);
        int drawId = news.getDrawID();
        String title = news.getTitle();
        String text = news.getText();
        Log.d(LogUtil.TAG,"drawId:"+ drawId + " title:"+ title + " text:"+text);
        // #C 将数据对应到控件
        HoldView holdView = (HoldView) arg1.getTag();
        holdView.iv_id.setImageResource(drawId);
        holdView.tv_title.setText(title);
        holdView.tv_text.setText(text);
        return arg1;
    }
    

  方法中的arg0代表下标,arg1即代表缓存,首次的时候,缓存中没有数据,进入if语句中,然后把控件存放在arg1中,也就是放入缓存中,以后就不用每次都从布局文件中取了,提高了效率。
  先前一直不明白一点:最后的这个return arg1有点不明白,应该说holdView中的数据已经填充上了,但是holdView已经是从arg1中拿出来的修改了,又没有重新放进去,arg1又怎么会改变?

  最后问了一下网友,说是holdView只是arg1中对应的一个引用,当修改了holdView,对应的arg1也修改了,这样的话,上面的代码应该很好理解了。