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[]{};
        }
    }
    
    @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?的更多相关文章

  1. Android 如何在ScrollView中嵌套ListView

    前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListVie ...

  2. android 布局文件 ScrollView 中的 listView item 显示不全解决方案

    import android.content.Context;import android.util.AttributeSet;import android.widget.ListView; /** ...

  3. Android实战技巧:如何在ScrollView中嵌套ListView

    前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListVie ...

  4. Android -- 在ScrollView中嵌套ListView

    在做一个工程,这个工程的布局可以相当的复杂,最外面是ScrollView,在ScrollView里面有两个Listview,这下好了,布局出来了,放在机子上跑,卡得想死有木有,信息乱跑乱出现,表示非常 ...

  5. Android ScrollView中嵌套ListView

    由于要做一个相似美团的团购产品.scrollview中还有嵌入listview,要是直接把listview嵌进scrollview中.listview的高度是固定的不能进行滑动.默认情况下Androi ...

  6. ScrollView中嵌套ListView时,listview高度显示的问题

    方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个Lis ...

  7. Android实践之ScrollView中滑动冲突处理

    转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52130923 1. 前言 在Android开发中,假设是一些简单的布局.都非常easy ...

  8. 解决在ScrollView中套用ListView显示不正常

    最近在设计Android程序时,因为需要在ScrollView中添加一个ListView列表来显示一些信息.刚开始并没有想太多,但添加进去后才发现ListView不论怎样定义都只能显示一行,显示效果很 ...

  9. 实现ScrollView中包含ListView,动态设置ListView的高度

    ScrollView 中包含 ListView 的问题 : ScrollView和ListView会冲突,会导致ListView显示不全 <?xml version="1.0" ...

随机推荐

  1. idea把java web项目打成war包

    1.新建artifacts 2.设置你的目录内容路径 3.找到项目web或webapp的路径 4.可以直接添加已经跑通的项目 5.配置完成点OK 6.编译打成war包 7.点击编译结束打完收工 8.找 ...

  2. 【Qt开发】【Linux开发】调试记录:QFontDatabase::loadFromCache Error

    最近做嵌入式的Qt界面,在移植成功后遇到了一个问题:QFontDatabase::loadFromCache: Font path doesn't match.后面跟着便是两个路径. 解决方案就是对比 ...

  3. Java——ArrayList底层源码分析

    1.简介 ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数 ...

  4. 使用Object.create()实现继承 用 Object.create实现类式继承

    使用Object.create()实现继承:https://www.cnblogs.com/cuew1987/p/4075027.html 用 Object.create实现类式继承:https:// ...

  5. Luogu P1315 [NOIP2012]观光公交

    题目 每次把加速器用在可以是答案减少最多的地方就即可.(这不是废话吗?) 具体而言,我们处理出: \(sum_i\)到\(i\)为止下车人数之和. \(t_i\)在\(i\)最晚的上车的人的上车时间. ...

  6. RouteReuseStrategy angular路由复用策略详解,深度刨析路由复用策略

    关于前端路由复用策略网上的文章很多,大多是讲如何实现tab标签切换历史数据,至于如何复用的原理讲的都比较朦胧,代码样例也很难适用各种各样的路由配置,比如懒加载模式下多级嵌套路由出口网上的大部分代码都会 ...

  7. nodejs版实现properties后缀文件解析

    1.propertiesParser.js let readline = require('readline'); let fs = require('fs'); // properties文件路径 ...

  8. Spark-Streaming获取kafka数据的两种方式:Receiver与Direct的方式

    简单理解为:Receiver方式是通过zookeeper来连接kafka队列,Direct方式是直接连接到kafka的节点上获取数据 Receiver 使用Kafka的高层次Consumer API来 ...

  9. git init error:Malformed value for push.default: simple

    git init error:Malformed value for push.default: simple 1.git config --global push.default matching

  10. listen - listen for connections on a socket 在一个套接字上倾听连接

    SYNOPSIS 概述 #include <sys/socket.h> int listen(int s, int backlog); DESCRIPTION 描述 在接收连接之前,首先要 ...