• 省去 ListView 滚动条 显示全部内容


    引用:http://www.cnblogs.com/LuoYer/archive/2011/05/07/2039884.html

    http://www.eoeandroid.com/thread-93669-1-1.html

      如果你想在ScrollView中包含ListView而产生了疑问,百思不得其解,那么,很可能就百度亦不得其解,Google仍不得其解了,你会在寻求答案的过程中,体会到众说纷纭是个什么涵义了。

      ListView本身就有滚动属性,会跟ScrollView冲突。所以,有人提到自定义功能,并且给出了实现方式;有人会提议换一种实现方式,避免一起使用;有人就更强硬,不能这么用。

      如果是自定义功能的话,这么多控件放在这里,动不动就自定义,虽然已经被人实现了,还是不免为搁置了那么多控件而不甘;如果是换一种方式去布局,要真是能够轻易实现,就不必为此大费周折来思考同时使用了;要说不能用,那只是需求没到,要真是这种方式最符合需求,虽说强扭的瓜不甜,呵呵,就是生的也得吃喽。

      如果,有人使用过Google的Market,那么,对这个两个界面应该比较熟悉:这是Apk文件的详细介绍界面,中间关于开发者介绍的截图。  

      操作过程中会发现,“About the developer”下属的三项内容,非常符合ListView的属性,点击进入对应功能页面,长按弹出模糊选项框(后面截图是下面内容长按弹出的,性质一样的)等功能。

       而且,中间部分整个布局是可以拖动的,明显ScrollView的性质。这就不能不让我硬着头皮来看是否能在ScrollView中使用ListView的可能性了。

       在查看了大量资料后,终于,让我得到了一个可以接受的结论:

      在ListView内容寥寥可数,而且选项操作是固定的情况下,是可以通过设置它的高度,让它“放弃”自身滚动属性,而放置到ScrollView中使用的。

      因为,不“放弃”自身滚动属性,就会出现:前面提到的三项内容,只能显示出一项多出来,拖动它的话,会滚动出现其他内容,也可以说是滚动中的滚动了。

      显然,Market中开发者的内容是固定的,而且,点击后的操作也是固定的,符合条件。

      当然,还是需要添加一些其他处理了:

      一、获取并设置ListView内容的高度:

    private void setListViewHeight(ListView lv) {
    ListAdapter la
    = lv.getAdapter();
    if(null == la) {
    return;
    }
    // calculate height of all items.
    int h = 0;
    final int cnt = la.getCount();
    for(int i=0; i<cnt; i++) {
    View item
    = la.getView(i, null, lv);
    item.measure(
    0, 0);
    h
    += item.getMeasuredHeight();
    }
    // reset ListView height
    ViewGroup.LayoutParams lp = lv.getLayoutParams();
    lp.height
    = h + (lv.getDividerHeight() * (cnt - 1));
    lv.setLayoutParams(lp);
    }

      二、通过设置标签,来响应具体操作:

      1.定义标签,及点击后的处理方法

    // developer information
    private final static String DEV_TAG_ID = "developer_id";
    private final static String DEV_TAG_HP = "developer_home_page";
    private final static String DEV_TAG_EM = "developer_email";
    private void developerItemClick(String tag) {
    if(DEV_TAG_ID.equals(tag)) {
    // display list of developer's apks
    } else if(DEV_TAG_HP.equals(tag)) {
    // visit developer's home page
    } else if(DEV_TAG_EM.equals(tag)) {
    // send mail to developer
    }
    }

      2.监听ListView点击设置

    final DevAdapter adapter = new DevAdapter(ApkInfo.this, listItem, tags,
    R.layout.developer_item, from, to);
    devInfoLv.setAdapter(adapter);
    devInfoLv.setOnItemClickListener(
    new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    developerItemClick(adapter.getItemTag(position));
    }
    });
    setListViewHeight(devInfoLv);

      3.自定义DevAdapter,主要添加了存储tags内容和获取点击项tag内容,以确定点击操作,供 2 使用。

    public class DevAdapter extends SimpleAdapter {
    private String[] tags;

    public DevAdapter(Context context, List<? extends Map<String, ?>> data,
    ArrayList
    <String> tags, int resource, String[] from, int[] to) {
    super(context, data, resource, from, to);
    int size = tags.size();
    this.tags = new String[size];
    for(int i=0; i<size; i++) {
    this.tags[i] = tags.get(i);
    }
    }

    public String getItemTag(int position) {
    return this.tags[position];
    }
    。。。 。。。
    }

      4.添加ListView项时,对应添加tag到tags中

    ArrayList<String> tags = new ArrayList<String>();
    //如果id存在
    tags.add(DEV_TAG_ID);
    //如果主页存在
    tags.add(DEV_TAG_HP);
    //如果邮箱存在
    tags.add(DEV_TAG_EM);
    注意:listView中的adapter里的getview中的view,只能是单个view  或是线性布局,不能为相对布局(可把相对布局放在线性布局中).
  • 相关阅读:
    根据会员权限显示指定字段教程与源码
    关键字替换排除HTML标签属性字符
    C# 图片处理(压缩、剪裁,转换,优化)
    点击按钮后表单自动提交的问题
    浏览器中添加收藏当前网页
    Javascript基础知识整理
    JS中不同类型的值比较问题
    ACM训练场
    sencha/extjs 动态创建grid表格
    sencha 报错问题汇总
  • 原文地址:https://www.cnblogs.com/sode/p/2163682.html
Copyright © 2020-2023  润新知