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