原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf
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

转载于:https://www.cnblogs.com/rabbit-bunny/p/4167085.html

[转载]Android: 如何实现ScrollView中含有ListView?相关推荐

  1. scrollview中嵌套listview产生冲突问题

    在scrollview中嵌套listview或者gridview时 如果listview或者gridview的高度时wrap-content会导致两者只显示一行多一点 原因: listview和gri ...

  2. ScrollView中嵌入ListView,让ListView全显示出来

    import android.widget.ListView; /** * ScrollView中嵌入ListView,让ListView全显示出来 * @author reyo * */ publi ...

  3. ScrollView中嵌入Listview,当item高度不一样的时候,item展示不全问题

    首先在scrollview中嵌入listview,我们需要动态设置listview的高度,否则只会展示一行. public void fixListViewHeight(ListView listVi ...

  4. Android之解决在scrollview中嵌套ListView切换界面时scrollview整体向下滑动

    有时候我们在scrollview中会嵌套ListView,在嵌套ListView(ListView上面还有一些控件)后,切换Activity时会发现整个 scrollview 被向下滑动直到ListV ...

  5. ScrollView中嵌套ListView

    放置比较少的ListView组件效果图:                         Item布局文件  list_view_item.xml  布局文件的内容: <RelativeLayo ...

  6. ScrollView中使用ListView

    转自 http://blog.csdn.net/fzh0803/article/details/7971391 由于scrollview和listview不能直接共存,在scrollview中直接使用 ...

  7. Android viewpager在scrollview中的滚动问题

    如果不自定义scrollview,viewpager在scrollview中的滚动有问题,例如,我有一个viewpager在scrollview中,我想达到的效果是,我作用滑动viewpager的时候 ...

  8. ScrollView中嵌套ListView控件,数据无法显示完全

    为什么80%的码农都做不了架构师?>>>    public void setListViewHeightBasedOnChildren(ListView listView) { / ...

  9. android+listview设置行高,android – 无法在行xml中设置listView行高的高度

    这是我的自定义适配器的getView方法: public View getView(int position, View convertView, ViewGroup viewGroup) { Sin ...

最新文章

  1. nRF52832 — 连接指定name、UUID、addr的蓝牙设备
  2. 杭电oj1003java实现
  3. 实时获取vuex更新的新数据_京东手机销量实时数据更新 荣耀Play4T Pro位列第一
  4. MySql中truncate,delete,drop的异同点
  5. web开发中的长度单位(px,em,ex,rem),如何运用,看完这篇就够了!
  6. spring和mybatis结合做简单的增删查改系统_如何从零开始设计权限管理系统
  7. Web框架——Flask系列之Jinja2自带过滤器(三)
  8. python与办公自动化专业就业方向_Python最好的几大就业方向与岗位技能要求【行业风向】...
  9. Git本地库版本控制和分支管理
  10. Struts2学习笔记(四) Action(中)
  11. mysql 更新并查询结果_数据库_基础知识_MySQL_UpdateSelect(根据查询出来的结果批量更新)...
  12. 计算机网络前三章试题,计算机网络前三章复习试题PPT课件.ppt
  13. vector向量容器的一些基本操作
  14. c51语言中 位取反指令,C51的几种位操作运算说明
  15. c语言开方不是整数怎么表示,c语言中的开方本人自学c语言,想请问在c中类似开方,取绝对值这类的(也不知道应该算运算符还是函数什么的)都要怎么解决~麻...
  16. android auto凯迪拉克,凯迪拉克支持Apple CarPlay及Android Auto
  17. win10录屏电流声_电脑录屏出现杂音?可能是这几种原因
  18. ThingsBoard设备在线状态-active服务端属性分析
  19. 各层电子数排布规则_核外电子的排布及其规律,亨利·莫塞莱和查尔斯·巴克拉最先发现电子层...
  20. DDD之Repository模式

热门文章

  1. 深度学习模型之各种caffe版本(Linux和windows)的网址
  2. 池化方法总结(Pooling)
  3. 深入理解 js 之继承与原型链
  4. Chrome开发者工具中Elements(元素)断点的用途
  5. Django model进阶
  6. 老树发新芽 靠PS之类的软件,上市30年的Adobe股价创新高
  7. 【PostMan】1、Postman 发送json格式请求
  8. 如何使用Total Recorder录制网上的音乐,如何下载只能试听的歌曲
  9. saltstack (1) 简介
  10. 自动构建工具Grunt