共存问题:
1.listview高度无效,需要重新计算,可以和scrollview共存。
2.两个都有滚动事件,这时不能共存;要想使用scrollview,可以自定义listview,扩展linearlayout。
两者都可以滑动,共存时listview只能显示一行数据,这时需要重新计算listview的高度
一、在布局中写死listview的高度,虽然能显示多行,对于海量数据并不适合。
二、自定义listview
public
class
MyListView
extends
ListView
{
public
MyListView(Context
context) {
super
(context);
}
public
MyListView(Context
context, AttributeSet attrs) {
super
(context,
attrs);
}
public
MyListView(Context
context, AttributeSet attrs,
int
defStyle)
{
super
(context,
attrs, defStyle);
}
@Override
protected
void
onMeasure(
int
widthMeasureSpec,
int
heightMeasureSpec)
{
int
expandSpec
= MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>
2
,
MeasureSpec.AT_MOST);
super
.onMeasure(widthMeasureSpec,
expandSpec);
}
}
三、重新设置listview的高度,并在填充adapter(setAdapter())后调用
public
void
setListViewHeightBasedOnChildren(ListView
listView) {
ListAdapter
listAdapter = listView.getAdapter();
if
(listAdapter
==
null
)
{
return
;
}
int
totalHeight
=
0
;
for
(
int
i
=
0
;
i < listAdapter.getCount(); i++) {
View
listItem = listAdapter.getView(i,
null
,
listView);
listItem.measure(
0
,
0
);
totalHeight
+= listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams
params = listView.getLayoutParams();
params.height
= totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() -
1
));
((MarginLayoutParams)params).setMargins(
10
,
10
,
10
,
10
);
listView.setLayoutParams(params);
}
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;
}
/**
* 绑定视图
* @param view
* @param item
* @param from
*/
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());
}
}
}
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;
}
/**
* 绑定视图
* @param view
* @param item
* @param from
*/
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());
}
}
}