关闭

自定义Adapter

标签: listviewandroidlayoutnullobjectstring
2204人阅读 评论(0) 收藏 举报
分类:

重写Adapter类需要实现的方法

需要重写Adapter类的四个方法即可,分别是

public
 
int
 getCount
();

public Object getItem ( int position );
public long getItemId ( int position );
public View getView ( int position , View convertView , ViewGroup parent );

调用时仍然是在ListView或ListActivity中直接setAdapter(CustomAdapter);即可

重写Adapter类

cover.xml的layout文件

<!-- 一个TextView用来放东西,一个ListView用来和fooAdapter绑定 -->

<linearlayout xmlns:android = "http://schemas.android.com/apk/res/android"    
   
android:layout_width = "fill_parent"
   
android:layout_height = "fill_parent"
   
android:orientation = "vertical" >  

   
<textview android:id = "@+id/title"
             
android:layout_width = "fill_parent"
             
android:layout_height = "wrap_content"
             
android:text = "@string/title"
             
android:textsize = "25pt" >
   
</textview>

   
<listview android:id = "@+id/summary"
             
android:layout_width = "fill_parent"
             
android:layout_height = "wrap_content" >  
   
</listview>  

</linearlayout>  

实现一个继承于Activity的类,在类中的onCreate()方法中把布局给画出来

public
 
class
 
Cover
 
extends
 
Activity
 
{
  

   
@Override  
   
public void onCreate ( Bundle savedInstanceState ) {  
       
super . onCreate ( savedInstanceState );  
       
//上面的布局
        setContentView
( R . layout . cover );  
       
ListView lv = ( ListView ) findViewById ( R . id . summary );  
       
//自定义Adapter
       
FooAdapter adapter = new FooAdapter ( this );  
        lv
. setAdapter ( adapter );  
   
}  
}  

继承于BaseAdapter

简单的显示只有一个TextView

/*用的数据源是个很简单的String[](最好数据从外部传入),同时在类中还加上了一个Context类型的变量_ctx,此变量将在构造时被赋值。放个简单的TextView,这里对getView做修改就可以了。*/

 
class FooAdapter extends BaseAdapter {  
     
private Context _ctx = null ;  
     
//数据源
     
private String [] _data = { "foo" , "bar" , "foobar" , "barfoo" };  
     
public FooAdapter ( Context context ) {  
         _ctx
= context ;  
     
}  
     
@Override  
     
public int getCount () {  
         
return _data . length ;  
     
}  
     
@Override  
     
public Object getItem ( int position ) {  
         
return _data [ position ];  
     
}  
     
@Override  
     
public long getItemId ( int position ) {  
         
return position ;  
     
}  
     
@Override  
     
public View getView ( int position , View convertView , ViewGroup parent ) {  
         
//创建个TextView存放数据
         
TextView tv = null ;  
         
if ( null == convertView ) {  
             tv
= new TextView ( _ctx );  
             
Log . v ( "huzim" , "Pos1 is " + position );  
         
} else {  
             tv
= ( TextView ) convertView ;  
         
}  
         tv
. setText ( _data [ position ]);  
         
return tv ;  
     
}  
}  

每次调用getView会返回一个LinearLayout,里面包含有两个TextView

 
//convertView为Adapter中每个数据显示的控件

 
@Override  
 
public View getView ( int position , View convertView , ViewGroup parent ) {  
     
LinearLayout lay = null ;  
     
     
TextView tv_l = new TextView ( _ctx );  
     
TextView tv_r = new TextView ( _ctx );  
     tv_l
. setText ( "* " );  
     tv_r
. setText ( _data [ position ]);  
     tv_r
. setGravity ( Gravity . RIGHT );  
     
if ( null == convertView ) {  
         lay
= new LinearLayout ( _ctx );  
         lay
. addView ( tv_l );  
         lay
. addView ( tv_r );  
     
} else {  
         lay
= ( LinearLayout ) convertView ;  
     
}  
     
return lay ;  
 
}  

每次返回一个TableLayout,暂时里面只有两列。

用TableLayout是因为有些列可能需要右对齐,好像在TextView里面做不了。 有一点需要注意的就是,在TableLayout中如果要设置右对齐的话, 一定需要给对应列设置ColumnStretchable属性,要不然内容不会展开。

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

     
TableRow tr = new TableRow ( _ctx );  
     
TextView tv_l = new TextView ( _ctx );  
     
TextView tv_r = new TextView ( _ctx );  
     tv_l
. setText ( "* " );  
     tv_r
. setText ( _data [ position ]);  
     
//右对齐
     tv_r
. setGravity ( Gravity . RIGHT );  
     tv_r
. setLayoutParams ( new TableRow . LayoutParams ( LayoutParams . FILL_PARENT , LayoutParams . WRAP_CONTENT ));  
     tr
. addView ( tv_l );  
     tr
. addView ( tv_r , new TableRow . LayoutParams ( LayoutParams . FILL_PARENT , LayoutParams . WRAP_CONTENT ));  
     
if ( null == convertView ) {  
         lay
= new TableLayout ( _ctx );  
         lay
. addView ( tr );  
     
} else {  
         lay
= ( TableLayout ) convertView ;  
     
}  
     
/*在TableLayout中如果要设置右对齐的话,一定需要给对应列设置ColumnStretchable属性,要不然内容不会展开*/
     lay
. setColumnStretchable ( 1 , true );  
     
return lay ;  
 
}  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31714次
    • 积分:689
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论