ListView 与 ScrollView 同在一界面会导致ListView 显示变形
下面是我的一个实现 步骤:
1、继承LinearLayout,既然会冲突那就不用ListView 改成线性布局做动态布局效果2、继承BaseAdapter ,可以参照一下Android app源码中 Widget 目录下的SimpleAdapter 为前面扩展的LinearLayout做数据。3、模拟数据填充扩展后的BaseAdapter 为扩展后的LinearLayout 加载数据
第一步:新建LinearLayoutForListView 类使其扩展LinearLayout重写以下两个方法:
public
LinearLayoutForListView(Context context) {
super
(context);
}
public
LinearLayoutForListView(Context context, AttributeSet attrs) {
super
(context, attrs);
}
这两个方法可选,不过建议都写上,第一个方法可以让我们通过 编程的方式 实例化出来,第二个方法可以允许我们通过 XML的方式注册 控件,可以在第二个方法里面为扩展的复合组件加属性。为其添加get / set 方法
下面是两个类的全部代码,读者可以无须更改直接使用:
LinearLayoutForListView
package
com.terry.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
public
class
LinearLayoutForListView
extends
LinearLayout {
private
AdapterForLinearLayout adapter;
private
OnClickListener onClickListener
=
null
;
public
void
bindLinearLayout() {
int
count
=
adapter.getCount();
for
(
int
i
=
0
; i
<
count; i
++
) {
View v
=
adapter.getView(i,
null
,
null
);
v.setOnClickListener(
this
.onClickListener);
if
(i
==
count
-
1
) {
LinearLayout ly
=
(LinearLayout) v;
ly.removeViewAt(
2
);
}
addView(v, i);
}
Log.v(
"
countTAG
"
,
""
+
count);
}
public
LinearLayoutForListView(Context context) {
super
(context);
}
public
LinearLayoutForListView(Context context, AttributeSet attrs) {
super
(context, attrs);
//
TODO Auto-generated constructor stub
}
public
AdapterForLinearLayout getAdpater() {
return
adapter;
}
public
void
setAdapter(AdapterForLinearLayout adpater) {
this
.adapter
=
adpater;
bindLinearLayout();
}
public
OnClickListener getOnclickListner() {
return
onClickListener;
}
public
void
setOnclickLinstener(OnClickListener onClickListener) {
this
.onClickListener
=
onClickListener;
}
}
import
import
import
import
import
public
}
AdapterForLinearLayout
package
com.terry.widget;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public
class
AdapterForLinearLayout
extends
BaseAdapter {
private
LayoutInflater mInflater;
private
int
resource;
private
List
<?
extends
Map
<
String,
?>>
data;
private
String[] from;
private
int
[] to;
public
AdapterForLinearLayout(Context context,
List
<?
extends
Map
<
String,
?>>
data,
int
resouce, String[] from,
int
[] to) {
this
.data
=
data;
this
.resource
=
resouce;
this
.data
=
data;
this
.from
=
from;
this
.to
=
to;
this
.mInflater
=
(LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public
int
getCount() {
//
TODO Auto-generated method stub
return
data.size();
}
@Override
public
Object getItem(
int
position) {
//
TODO Auto-generated method stub
return
data.get(position);
}
@SuppressWarnings(
"
unchecked
"
)
public
String get(
int
position, Object key) {
Map
<
String,
?>
map
=
(Map
<
String,
?>
) getItem(position);
return
map.get(key).toString();
}
@Override
public
long
getItemId(
int
position) {
//
TODO Auto-generated method stub
return
position;
}
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
//
TODO Auto-generated method stub
convertView
=
mInflater.inflate(resource,
null
);
Map
<
String,
?>
item
=
data.get(position);
int
count
=
to.length;
for
(
int
i
=
0
; i
<
count; i
++
) {
View v
=
convertView.findViewById(to[i]);
bindView(v, item, from[i]);
}
convertView.setTag(position);
return
convertView;
}
private
void
bindView(View view, Map
<
String,
?>
item, String from) {
Object data
=
item.get(from);
if
(view
instanceof
TextView) {
((TextView) view).setText(data
==
null
?
""
: data.toString());
}
}
}
import
import
import
import
import
import
import
import
public
}
对应的XML 如下:
<?
xml version="1.0" encoding="UTF-8"
?>
< LinearLayout
xmlns:android
="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<
TextView
android:id
="@+id/TextView01"
android:layout_marginLeft
="10px"
android:textAppearance
="?android:attr/textAppearanceLarge"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
>
</
TextView
>
<
TextView
android:id
="@+id/TextView02"
android:layout_width
="wrap_content"
android:textAppearance
="?android:attr/textAppearanceSmall"
android:layout_marginLeft
="10px"
android:layout_height
="wrap_content"
>
</
TextView
>
<
View
android:layout_height
="1px"
android:background
="#FFFFFF"
android:layout_width
="fill_parent"
></
View
>
</ LinearLayout >
< LinearLayout
</ LinearLayout >
第三步:主页面使用控件并为其设置数据
XML如下:
加载数据如下:
lv
=
(LinearLayoutForListView) findViewById(R.id.ListView01);
for
(
int
i
=
0
; i
<
10
; i
++
) {
HashMap
<
String, Object
>
map
=
new
HashMap
<
String, Object
>
();
map.put(
"
key_name
"
,
"
name
"
+
i);
map.put(
"
value_name
"
,
"
value
"
+
i);
list.add(map);
}
final
AdapterForLinearLayout Layoutadpater
=
new
AdapterForLinearLayout(
this
, list, R.layout.test,
new
String[] {
"
key_name
"
,
"
value_name
"
},
new
int
[] { R.id.TextView01,
R.id.TextView02 });
事件操作,并通过下标得到数据源:
lv.setOnclickLinstener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
//
TODO Auto-generated method stub
Toast.makeText(
BlueToothActivity.
this
,
Layoutadpater.get(Integer.parseInt(v.getTag()
.toString()),
"
key_name
"
),
1000
).show();
}
});
lv.setAdapter(Layoutadpater);
Tip:get方法是在Layoutadpater 封装的一个通过下标获取相应数据的方法请参考上文。
至此完成。有碰到这个问题的朋友可以试试。