[转载]Android: 如何实现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[]{};
}
}
@Override
public int getCount() {
return mKeys.length;
}
@Override
public String getItem(int index) {
if(index>=0 && index<mVals.length)
return mVals[index];
else
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position <0 || position > mKeys.length)
return null;
final String key = mKeys[position];
final String title = mTitles[position];
final String val = mVals[position];
View v = convertView;
if (v == null) {
v = mLI.inflate(R.layout.dev_web_email_layout, null);
}
v.setId(position+VIEW_INDEX);
v.setClickable(true);
if (true) {
TextView v_title = (TextView) v.findViewById(R.id.dev_title);
TextView v_val = (TextView) v.findViewById(R.id.dev_val);
v_title.setText(title);
v_val.setText(val);
}
return v;
}
private void callBrowser(String url){
if(TextUtils.isEmpty(url))
return;
final String prefix = "http://";
try {
if(!url.startsWith(prefix))
url = prefix + url;
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
mContext.startActivity(intent);
} catch (Exception e) {
String err_msg = e.getMessage();
Log.d(LOG_TAG, "Uri err: " + err_msg);
}
}
private void callEmail(String emailbox){
if(TextUtils.isEmpty(emailbox))
return;
final String prefix = "mailto:";
try {
if(!emailbox.startsWith(prefix))
emailbox = prefix + emailbox;
Uri uri = Uri.parse(emailbox);
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
mContext.startActivity(intent);
} catch (Exception e) {
String err_msg = e.getMessage();
Log.d(LOG_TAG, "Uri err: " + err_msg);
}
}
public android.view.View.OnClickListener myOnClickListener
= new android.view.View.OnClickListener() {
@Override
public void onClick(View v) {
try {
int id = v.getId();
int position = id-VIEW_INDEX;
if(position <0 || position > mKeys.length)
return;
final String key = mKeys[position];
final String title = mTitles[position];
final String val = mVals[position];
if("website".equals(key)) {
callBrowser(val);
} else if("email".equals(key)) {
callEmail(val);
}
} catch (Exception e) {
// Do nothing!
}
}
};
}
相关的layout文件部分如下:
<TextView android:id="@+id/detail_developer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/lbl_title_developer"
android:textStyle="bold"
android:background="#008F00"
>
</TextView>
<com.xxx.yyy.LinearLayoutForListView android:id="@+id/detail_lst_web_email"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="visible"
android:clickable="true"
>
</com.xxx.yyy.LinearLayoutForListView>
以下代码向这个假的ListView填入数据:
com.xxx.yyy.LinearLayoutForListView lst_developer
= (com.xxx.yyy.LinearLayoutForListView) findViewById(R.id.detail_lst_web_email);
String keys[]={ "website", "email"};
String titles[]={getResources().getString(R.string.lbl_title_developer_website),
getResources().getString(R.string.lbl_title_developer_email)};
String vals[]={"http://abc.com", "abc@def.com"};
DeveloperInfoAdapter developerAdapter = new DeveloperInfoAdapter(this, keys, titles, vals);
lst_developer.setOnclickLinstener(developerAdapter.myOnClickListener);
lst_developer.setAdapter(developerAdapter);
<完>
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com
[转载]Android: 如何实现ScrollView中含有ListView?的更多相关文章
- Android 如何在ScrollView中嵌套ListView
前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListVie ...
- android 布局文件 ScrollView 中的 listView item 显示不全解决方案
import android.content.Context;import android.util.AttributeSet;import android.widget.ListView; /** ...
- Android实战技巧:如何在ScrollView中嵌套ListView
前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListVie ...
- Android -- 在ScrollView中嵌套ListView
在做一个工程,这个工程的布局可以相当的复杂,最外面是ScrollView,在ScrollView里面有两个Listview,这下好了,布局出来了,放在机子上跑,卡得想死有木有,信息乱跑乱出现,表示非常 ...
- Android ScrollView中嵌套ListView
由于要做一个相似美团的团购产品.scrollview中还有嵌入listview,要是直接把listview嵌进scrollview中.listview的高度是固定的不能进行滑动.默认情况下Androi ...
- ScrollView中嵌套ListView时,listview高度显示的问题
方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个Lis ...
- Android实践之ScrollView中滑动冲突处理
转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52130923 1. 前言 在Android开发中,假设是一些简单的布局.都非常easy ...
- 解决在ScrollView中套用ListView显示不正常
最近在设计Android程序时,因为需要在ScrollView中添加一个ListView列表来显示一些信息.刚开始并没有想太多,但添加进去后才发现ListView不论怎样定义都只能显示一行,显示效果很 ...
- 实现ScrollView中包含ListView,动态设置ListView的高度
ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...
随机推荐
- 【读书笔记】GitHub入门
代码管理方式--集中与分散 集中型 以 Subversion 为代表的集中型,所示将仓库集中存放在服务器之中,所以只存在一个仓库.这就是为什么这种版本管理系统会被称作集中型. 集中型将所有数据集中存放 ...
- [转帖]APT34攻击全本分析
APT34攻击全本分析 https://zhuanlan.kanxue.com/article-8401.htm 高手太多 我等菜鸟目不暇接.. 一.事件综述 2019年4月18日,黑客/黑客组织使用 ...
- [19/09/19-星期四] Python中的字典和集合
一.字典 # 字典 # 使用 {} 来创建字典 d = {} # 创建了一个空字典 # 创建一个保护有数据的字典 # 语法: # {key:value,key:value,key:value} # 字 ...
- c++多线程并发学习笔记(1)
共享数据带来的问题:条件竞争 避免恶性条件竞争的方法: 1. 对数据结构采用某种保护机制,确保只有进行修改的线程才能看到修改时的中间状态.从其他访问线程的角度来看,修改不是已经完成了,就是还没开始. ...
- nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG
需求描述,由于工作的需要,需要将原本用于1280 720的网页改为1920 1080的网页(电视端页面).需求可以拆分为两部分,代码部分的修改以及图片的修改.在代码部分,需要将所有位置以及大小相关的值 ...
- Spring boot项目集成Neo4j
第一步,创建Springboot工程 使用Eclipse 创建Maven项目,并修改pom.xml文件为: <?xml version="1.0" encoding=&quo ...
- Burp Suite详细使用教程-Intruder模块详3
Burp Suite使用详细教程连载的第三章.0×02 Intruder—内置有效负荷测试使用技巧内置有效负荷测试选择项如下图: 今天的小技巧使用的是 numbers,给大伙科普下:Numbers 数 ...
- 录屏状态监听之防录屏 - iOS
继之前接到电话.短信和截屏监听需求之后,在 iOS 11.0 系统之上新增了屏幕录制的新功能玩法,所以也随之迎来了新的屏幕录制监听的需求,即防录屏功能监听 ... 通过官方文档得知 capturedD ...
- Ansible 管理Windows 受控端
- Codeforces 920 反图联通块 线段树质因数暴力
A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...