Android: 如何实现ScrollView中含有ListView
来源:互联网 发布:黑客腾讯软件下载中心 编辑:程序博客网 时间:2024/05/18 00:44
http://blog.sina.com.cn/s/blog_508c743a01010qua.html
ListView本身就含有ScrollView,因此把ListView放到ScrollView中会引起混乱(谁来响应滑动事件?)但有时又确有此需求,以实现ListView的内容连同其他内容的滚动。
要想把ListView嵌入ScrollView,有二个方法:
方法1:整体上使用一个ListView, 把不需滚动的部分放入ListView的Header或Footer中。注意: 一定要先添加HearderView和FooterView,然后再设置ListView的Adapter.缺陷: Header或Footer中的内容不能滚动;并且只能允许同时存在一个ListView。代码如下: LayoutInflater mLI =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
listView = (ListView) findViewById(R.id.listView);
datas = new ArrayList<Object>();
fillDatas();
datasAdapter = new DemoListAdapter(context, datas);
MyListHeaderView headerView = mLI.inflate(R.layout.my_header_layout, null);
FillDataToHeaderView(headerView);
MyListFooterView footerView = mLI.inflate(R.layout.my_footer_layout, null);
FillDataToFooterView(footerView);
listView.addHeaderView(headerView);
listView.addFooterView(footerView);
listView.setAdapter(datasAdapter);
方法2:用LinearLayout模拟ListView, 从而实现任意内容的滚动。
下面实现的是一个通用的LinearLayoutForListView,可以为它设置不同的Adapter从而显示不同的数据。
LinearLayoutForListView的代码如下:
public class LinearLayoutForListView extends android.widget.LinearLayout {
static final String LOG_TAG = "LinearLayoutForListView";
private android.widget.BaseAdapter adapter;
private OnClickListener onClickListener = null;
public void fillLinearLayout() {
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
View v = adapter.getView(i, null, null);
v.setOnClickListener(this.onClickListener);
addView(v, i);
}
Log.v("countTAG", "" + count);
}
public LinearLayoutForListView(Context context) {
super(context);
}
public LinearLayoutForListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public android.widget.BaseAdapter getAdpater() {
return adapter;
}
public void setAdapter(android.widget.BaseAdapter adpater) {
this.adapter = adpater;
fillLinearLayout();
}
public OnClickListener getOnclickListner() {
return onClickListener;
}
public void setOnclickLinstener(OnClickListener onClickListener) {
this.onClickListener = onClickListener;
}
}
注意,上面LinearLayoutForListView的成员adapter是BaseAdapter,因此可以自定义其它的Adapter来加入数据。下面是一个Adapter的参考实现,用于显示一个软件开发者的联系信息:
public class DeveloperInfoAdapter extends BaseAdapter {
static final String LOG_TAG="DeveloperInfo";
public final int VIEW_INDEX = 3000;
private Context mContext;
private String[] mKeys;
private String[] mTitles;
private String[] mVals;
LayoutInflater mLI = null;
public DeveloperInfoAdapter(Context context, String[] keys, String[] titles, String[] vals) {
mContext = context;
mKeys = keys;
mTitles = titles;
mVals = vals;
mLI = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// to Make sure mKeys(...) are NOT null:
if(mKeys==null || mTitles==null || mVals==null) {
mKeys = mTitles = mVals = new String[]{};