注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

关于适配器的getView()函数  

2010-05-19 11:04:11|  分类: 数据适配器 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
getView是在Adapter中申明
public abstract View getView (int position, View convertView, ViewGroup parent)
Since: API Level 1
Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file. When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to specify a root view and to prevent attachment to the root.
Parameters
position     The position of the item within the adapter's data set of the item whose view we want.
convertView     The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view.
parent     The parent that this view will eventually be attached to
    //什么时候需要把新生成的View连接到parent?
Returns
    * A View corresponding to the data at the specified position. 
我写了个测试程序(见附件1)测试ArrayAdapter,最终得到如下结论
1、 该函数在绘画的时候才调用。
2、 ArrayAdapter中每一项数据就对应一个视图convertView。

如果ArrayAdapter有7项数据那么对应的View也就有7个
3、 第一次画某项时convertView为null,要创建View。下次在画该项是convertView就不为空了。他就是上次的创建 View。就可以利用该View而不用再创建。
但是对ViewGroup parent的还是很困惑
什么时候需要把新生成的View连接到parent?
   public View        getView(int position, View  convertView, ViewGroup  parent)
     {
         TextView v =null;
           
if(convertView==null){
               LayoutInflater vi = null;
               vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             
  //这里只是把它的LayoutParams参数给新生成的View用,并没把生成的View连接到root
               //v =(TextView)vi.inflate(R.layout.list_row, parent, false);
               
               v =(TextView)vi.inflate(R.layout.list_row,null);
   /*什么时候需要把新生成的View连接到parent?
    反正在ArrayAdapter是不支持。会抛异常
    java.lang.UnsupportedOperationException: addView(View, LayoutParams) is 
    not supported in AdapterView
    */

    //v =(TextView)vi.inflate(R.layout.list_row,parent);
           }
           else{
               v = (TextView)convertView;
           }
               v.setText((String)this.getItem(position));
           return v;
     }
附件1:
public class HelloList extends ListActivity{    
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main3);        
        List<String> items = fillArray();        
        ArrayAdapter<String> adapter = new MyArrayAdapter<String>(this,R.layout.list_row,items);              
        this.setListAdapter(adapter);
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable,speed);
    }
    private List<String> fillArray(){
        List<String> items = new ArrayList<String>();
        items.add("1");
        items.add("2");
        items.add("3");
        items.add("4");
        items.add("5");
        items.add("6");
        items.add("7");
        return items;
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {
        TextView txt = (TextView)this.findViewById(R.id.text);
        txt.setText("selected"+l.getSelectedItem().toString()+"!");
    }
    private Handler mHandler;
    public int speed=1000;
    public int cnt=0;
    private final Runnable mRunnable = new Runnable() {
        public void run() {
            cnt++;
            int k=HelloList.this.getListView().getChildCount();
            HelloList.this.getListView().invalidateViews();
            Log.i("hubin",k+"run"+cnt);
            
                mHandler.postDelayed(this, speed);
        }
    };    
}
class MyArrayAdapter<T> extends ArrayAdapter<T>
{
    MyArrayAdapter(Context  context, int textViewResourceId)
    {
        super(context, textViewResourceId);
    }
    MyArrayAdapter(Context  context, int textViewResourceId,List<T>  objects)
    {
        super(context, textViewResourceId,objects);
    }
     public View        getView(int position, View  convertView, ViewGroup  parent)
     {
         View v=super.getView(position, convertView, parent);
         Log.i("hubin","v:"+v+"cv:"+convertView);
         return v;
     }
}
测试结果如下:
v:android.widget.TextView@43d0d488 cv:null
v:android.widget.TextView@43d0dec8 cv:null
v:android.widget.TextView@43d0e6e0 cv:null
v:android.widget.TextView@43d0eef8 cv:null
v:android.widget.TextView@43d0f710 cv:null
v:android.widget.TextView@43d0ff28 cv:null
v:android.widget.TextView@43d10740 cv:null
7run1
v:android.widget.TextView@43d10740 cv:android.widget.TextView@43d10740
v:android.widget.TextView@43d0ff28 cv:android.widget.TextView@43d0ff28
v:android.widget.TextView@43d0f710 cv:android.widget.TextView@43d0f710
v:android.widget.TextView@43d0eef8 cv:android.widget.TextView@43d0eef8
v:android.widget.TextView@43d0e6e0 cv:android.widget.TextView@43d0e6e0
v:android.widget.TextView@43d0dec8 cv:android.widget.TextView@43d0dec8
v:android.widget.TextView@43d0d488 cv:android.widget.TextView@43d0d488
7run2
v:android.widget.TextView@43d0d488 cv:android.widget.TextView@43d0d488
v:android.widget.TextView@43d0dec8 cv:android.widget.TextView@43d0dec8
v:android.widget.TextView@43d0e6e0 cv:android.widget.TextView@43d0e6e0
v:android.widget.TextView@43d0eef8 cv:android.widget.TextView@43d0eef8
v:android.widget.TextView@43d0f710 cv:android.widget.TextView@43d0f710
v:android.widget.TextView@43d0ff28 cv:android.widget.TextView@43d0ff28
v:android.widget.TextView@43d10740 cv:android.widget.TextView@43d10740
  评论这张
 
阅读(2043)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017