自定义Adapter

原创 2011年01月24日 01:30:00

重写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 ;  
 
}  

ListView的自定义适配器Adapter

  • 2017年08月22日 10:39
  • 229KB
  • 下载

在ListView中自定义Adapter

  • 2013年06月13日 19:33
  • 6KB
  • 下载

Android中利用ViewHolder优化自定义Adapter的典型写法(讨论ViewHolder的修饰方式)

转载自:点击打开链接 利用ViewHolder优化自定义Adapter的典型写法   最近写Adapter写得多了,慢慢就熟悉了。   用ViewHolder,主要是进行一些性能优化,减少一些不必要...

GridView用自定义Adapter

  • 2013年09月17日 19:04
  • 3.89MB
  • 下载

Android自定义适配器Adapter浅析

在android日常开发中,我们用到最多的就是加载数据,尤其是适配器,Adapter是连接后端数据和前端显示的适配器接口。如下图直观的表达了Data、Adapter、View三者的关系: 1、我刚刚...
  • z_zT_T
  • z_zT_T
  • 2016年07月06日 11:31
  • 380

ListView的自定义Adapter的性能优化

ListView可以说是安卓开发中经常用到的了。常常想让ListView的每个item中显示的东西多一点,比如说显示图片、文字、时间等等,这就需要我们自定义adapter,重写getView方法。本文...

自定义Adapter填充ExpandableListView

  • 2016年11月10日 16:47
  • 1.41MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义Adapter
举报原因:
原因补充:

(最多只允许输入30个字)