listview 订阅
ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。 展开全文
ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,还可管理列表中项目的排序方法和选定项目的外观。
信息
外文名
LISTVIEW
类    型
控件
功    能
可使用四种不同视图显示项目
属    性
计算机技术
LISTVIEW属性
DropHighlight属性(ListView, TreeView控件),LabelEdit属性,SelectedItem属性(ActiveX控件),ColumnHeaderIcons属性,Checkboxes属性,FullRowSelect属性,AllowColumnRecorder属性,FlatScrollBar属性,GridLines属性(ListView控件),HoverSelection属性,PictureAlignment属性,HotTracking属性,TextBackground属性,Arrange属性(ListView控件),ColumnHeaders属性(ListView控件),HideColumnHeaders属性(ListView控件),Icons,SmallIcons属性,ListItems属性(ListView控件),LabelWrap属性(ListView控件),MultiSelect属性(ListView,TabStrip控件),SorKey属性(ListView控件),SortOrder属性(ListView控件),View属性(ListView控件),Sorted属性(ListView控件),TabIndex属性,DragIcon属性,DragMode属性,MouseIcon属性,TabStop属性,HelpContextID属性,Name属性,Parent属性,Font属性,Container属性,ToolTipText属性,WhatsThisHelpID属性,OLEDragMode属性(ActiveX控件),OLEDropMode属性(ActiveX控件),Picture属性(ActiveX控件),Height,Width属性(ActiveX控件),Index属性(ActiveX控件),Left, Top属性(ActiveX控件),Tag属性(ActiveX控件),Object属性(ActiveX控件),Appearance属性(ActiveX控件),BackColor, ForeColor属性(ActiveX控件),BorderStyle属性(ActiveX控件),Enabled属性(ActiveX控件),HideSelection属性(ActiveX控件),hWnd属性(ActiveX控件),MousePointer属性(ActiveX控件)。
收起全文
精华内容
参与话题
问答
  • ListView

    千次阅读 2011-05-15 14:13:00
     ListView 是 AdapterView的子类,AdapterView.OnItemClickListener、AdapterView.OnItemSelectedListener 这些关乎Item的操作都是在AdapterView中就有的抽象。  ListView 只是在此基础上加了一些其他的功能,...

    1. 基本使用方法

        ListView 是 AdapterView的子类,AdapterView.OnItemClickListener、AdapterView.OnItemSelectedListener 这些关乎Item的操作都是在AdapterView中就有的抽象。
        ListView 只是在此基础上加了一些其他的功能,比如:addFooterView、addHeaderView  等,

       //使用示例

       ListView listView=new ListView(context);
       listView.setCacheColorHint(0);//滚动时透明
       Drawable color=new ColorDrawable(0xFFFFFFFF); //或使用Color.parseColor("#FFFFFF"),若使用0x00FFFFFF显示不出来。
       listView.setDivider(color);//设置分割线
       listView.setDividerHeight(1);

     

       xml配置:

        <ListView android:id="@+id/listView" 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" 
            android:divider="#FFF"
            android:dividerHeight="1px"
            android:layout_margin="10dip"/>

     

     

    2.Adapter介绍 http://code.google.com/p/androidlearn/wiki/Adapter

       ArrayAdapter是一个绑定View到一组对象的通用类。默认情况下,ArrayAdapter绑定每个对象的toString值到在layout中预先定义的TextView控件上。 可变通的,构造函数允许你使用更加复杂的layout或者通过重写getView方法来扩展类从而使用TextView的替代物(如ImageView或嵌套的layout)。

     

        The android.R.layout.simple_list_item_1.xml Android example source code

        http://www.devdaily.com/java/jwarehouse/android-examples/platforms/android-2/data/res/layout/simple_list_item_1.xml.shtml

     

    重写Adapter类需要实现的方法  http://code.google.com/p/androidlearn/wiki/Adapter_custom

    需要重写Adapter类的四个方法
    public int getCount();

    public Object getItem(int position);

    public long getItemId(int position);

    public View getView(int position, View convertView, ViewGroup parent);

     

    3.过滤

       listView.setTextFilterEnabled(true);
       listView.setFilterText("a");

       会显示出一个过滤后的新的ListView层

      Android的数据过滤机制  http://winuxxan.blog.51cto.com/2779763/509931

     

    4.多选

       ListView 可以以多种样式展现,比如多选式设置 ArrayAdapter<T>() 的第二个参数为 android.R.layout.simple_list_item_multiple_choice,但此时的列表项被选中后并不会出现“绿勾”,还需 ListView的 setChoiceMode(ListView.CHOICE_MODE_MULTIPLE) 方法辅助。

       http://www.i1987.org/?p=242

      取多选的结果  

     SparseBooleanArray sparseBooleanArray=listView.getCheckedItemPositions();
           int size=sparseBooleanArray.size();
           for(int i=0;i<size;i++)
           {
            int index=sparseBooleanArray.keyAt(i);
           
            //如果选中后中再去掉选择,这个项仍被选中了,在这里需要再次判断
            if(listView.getCheckedItemPositions().get(index))
            {
             .....
            }
           }

     

    5.刷新

       BaseAdapter.notifyDataSetChanged();

     

    6.ArrayAdapter

       例 ArrayAdapter<Object> listViewAdapter=new ArrayAdapter<Object>(this,android.R.layout.simple_list_item_1,objList);
            listView.setAdapter(listViewAdapter);

     

    7.快速滑动效果,在开始普通滚动列表后,滑动控制块出现。

       listView.setFastScrollEnabled(true);//就这么简单

     

    8.addHeaderView

      1.addHeaderView在setAdapter之前调用,2.HeaderView不要设置setLayoutParams, 3.onClick的position
      EditText editText=new EditText(this);
      editText.setText("abc");
      listView.addHeaderView(editText);

     

    9.
      

     

     

    展开全文
  • Android实现ListView的A-Z字母排序和过滤搜索功能,完整源码,小伙伴需要的来CSDN下载吧!项目详情http://blog.csdn.net/xiaanming/article/details/12684155
  • Android核心组件 ListView 详解

    万人学习 2016-05-28 19:47:58
    在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。 ListView可以使用列表的形式来展示内容,超出屏幕部分的内容只需要通过...
  • android listView嵌套ListView,子listView第一个显示全了,其他的没显示。 ![图片说明](https://img-ask.csdn.net/upload/201708/22/1503391737_599360.jpg) 下面是我的代码。帮看看哪里有问题。。 这是第一个...
  • 我想做一个这样的的布局!...下面是listview,我就是不清楚上面怎么做,如果用headerView 怎么才能实现响应的的点击响应事件!...我就是不知道listview上的布局要怎么做(listview上的布局会跟随listview一起滑动的~~!)
  • 我的思路如图所示,大listview嵌套小listview,但是我发现一个问题是给小listview设置适配器后,传入的值与到达小listview getview时的值不一致(值多了好多个,而每一组数据都是乱的,比传入的数据多几个),不知道...
  • 横向ListView的完整实现 包含基于横向listview做的一个小相册demo 具体过程参见:http: blog csdn net yanzi1225627 article details 21294553
  • ListView嵌套ListView优化

    千次阅读 2014-05-07 21:43:46
    在做业务时候,一个ListView显示多种数据类型,我们想到的方法是ListView在嵌套一个ListView,对于子ListView 占父ListView的一行,就解决了问题,但是这样的逻辑是不是有点奇怪呢? 第一,父ListView的长度size...
    在做业务时候,一个ListView显示多种数据类型,我们想到的方法是ListView在嵌套一个ListView,对于子ListView
    占父ListView的一行,就解决了问题,但是这样的逻辑是不是有点奇怪呢?


    第一,父ListView的长度size需要加1,因为增加了一行放子listView
        public int getCount() {
            return datas.size()+1;
        }

    第二,需要判断在什么地方插入子listView ,就要用到getViewTypeCount()和getItemViewType (int position)两个方法

    public int getItemViewType (int position){
            if(position==CHRILDLOCATION){//插入子ListView位置
                 return  TYPE_0;//TYPE_0表示子ListView标志
           }
              
    return  TYPE_1;//TYPE_1表示父ListView标志

    }

    第三,需要在父UI更新时候,当position>CHRILDLOCATION时对position-1,因为你在前面插入了子listView,其实后
    面得到的position,都占了一个位置.需要这时候减去
    这三步理解起来就让人够烦了,很混乱吧,还有更糟糕的事情,就是,子ListView你还要new 一个Adapter来遍历

    出它的item,这样就形成循环中嵌套循环,你的代码性能是不是很差。


    重点来了:

    我们可以在传入Adapter的数据中做文章,把不同的数据类型都用Object代替,然后把Object放入List集合,

    在Adapter,判断类型,比如:一个商品列表,中间会杂着一些商品主题团,我们就通过List<Object>封装

    这两种数据类型,实现对上面ListView嵌套的讲解。


    第一,在Adapter之外封装成一个List<Object>,就不需要在用到子ListView了,数据都在list中,也就不需要对

    datas.size()+1的操作了,只需要判断数据类型,然后做上面第二步操作;

    public int getItemViewType (int position){
            if(datas.get(position) instanceof “商品主题团”){
                 return  TYPE_0;//TYPE_0表示商品主题团

           }
              

    return  TYPE_1;//TYPE_1表示商品

    }


    完了,也就不需要对数据更新Ui时候减一操作,避免了降低了出错的概率。
    主要是不需要在getView中在new Adapter了,性能提高很大。
    展开全文
  • 点击上面的最上面一项里面listview中的哪个小手机删除的时候把下面那一项里面的listview中的三项都删除了 还有就是前面三项都删了的时候删除第四项的时候下标越界 我的思路是我在删除的时候并不知道我删除的到底是...
  • 具体情况是,在ScrollView中的LinearLayout中嵌套了很多布局,其中有ListView,要实现的 效果是,当点击ListView中的某个按钮后,会联网下载数据(文字和图片,图片的宽高不确定),现在数据都能正常的显示完全,...
  • ListView滑动删除 ,仿腾讯QQ 源码程序

    千次下载 热门讨论 2014-04-04 23:15:25
    ListView滑动删除 ,仿腾讯QQ的源码
  • listview 运行时的异常

    2013-04-22 06:52:27
    listview = (ListView)findViewById(R.id.listView1); PackageManager pm = getPackageManager(); List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); ...
  • ListViewItem lv = new ListViewItem(id); listView2.Items.Add(lv); lv.SubItems.AddRange(new string[] {o.Money.ToString(), o.PayType, o.PayWay,o.PayTime,o.FromWhere,o.Owner,o.InFo}); */ string[]...
  • listview 获取item坐标

    2013-08-02 09:16:57
    listview 获取item坐标 当listview高度是固定的,上拉item后,就很难计算拉动后的item坐标了 private void initPop(View v,int position){ View popupWindow_view =inflater.inflate(R.layout.login, null); ...
  • 一点击ListView就闪退

    2014-02-06 11:10:40
    02-06 10:58:39.377: E/MessageQueue-JNI(764): at android.widget.ListView.layoutChildren(ListView.java:1538) * 部分代码: * protected void onCreate(Bundle savedInstanceState) { super....
  • Listview复选框的选择

    2013-04-22 05:01:51
    我创建了一个自定义的 listview,有 Image,Text 和 checkbox。如何检测是否选择或未选择复选框。我使用了 onItemClick() 但是没有被调用。我使用的正确吗? class PInfo { String appname = ""; String ...
  • C#listview 返回items.index

    2015-06-06 06:19:02
    为什么listview无论点哪行items.index都返回0 ``` private void Hide_ToolStripMenuItem_Click(object sender, EventArgs e) { //隐藏数据 if (MessageBox.Show("是否隐藏本条数据?", "提问", ...
  • ListView中加了头和尾后不显示HeaderView。当ListView高度为精确值时(dp)没问题。但当为match_parent和wrap_content时就只能看到尾了,看不到头(头成是空白了)。 **activity_main.xml:** ``` ...
  • 我的项目里,想要禁止listview滑动,百度了下,网上有人建议用以下方法,即拦截onTouch中的ACTION_MOVE。程序如下: @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction...
  • Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,项目详情http://blog.csdn.net/xiaanming/article/details/17539199
  • 准备了2个图标在Listview里显示,判断条件来添加不同的图标。 str1,str2都是Tstringlist。 For循环对比str1与str2的内容,如果相同listview.item.add.imageindex := 0; 否则listview.item.add.imageindex := 1; 搞...
  • 原始需求:需要在listview空间中用LargeIcon模式显示,根据加载数据不同显示为一个m×n的矩阵,由于没找到在listview中控制每行显示个数的属性,所以决定通过动态计算listview宽高的方式实现,例如:5×3个,单个...
  • 求助,程序中折叠的listView出现问题。 这个listView是显示词典单词的,并且可以折叠。唯一的问题是每次触摸到其中的单词,list就会滚动到底部。 XML文件: android:layout_width="match_parent" ...
  • 如图1所示,左边是个ListView,与DataTable绑定,根据右边的几个选项条件,列表显示不同的内容。在没有选择列表中的任何一行时,选择不同的条件(如报警等级),列表显示一切正常。 问题来了,如图1所示。假设,...
  • ListView乱谈之ListView的布局

    千次阅读 2015-09-26 18:09:15
    ListView 布局实现原理的简单总结

      本来预备写一篇博客的,写着写着发现要想细细写起来还是要很大篇幅,所以就预计写三篇博客。本篇主要是写ListView的布局,相对来说是本篇篇幅不是很大,其实对于android高手来说ListView的布局他们应该很容易就能知道其原理,不过还是准备把我的心得写出来,有不足和错误之处欢迎批评吐槽,批评吐槽过后再给指点一二。

    ListView的布局就像在我之前实现的简单的横向ListView那样(详情点击此处),核心方法就是layout(left,top,right,bottom)方法的调用,该方法参数可以用如下图来说明:


    其实通过这个图不难想象出让Adapter对象里getView方法所返回的View一个个竖直排列的思想很简单:在ListView高度允许的范围内,循环遍历Adapter中的ItemView,对该View进行测量并通过layout方法布局到ListView中去;然后取Adapter中的下一个position的View(在此称之为nextView),通过相应的位置计算,让nextView布局在上一个View的下面,到此完成布局的过程。上面所说的相应的位置计算,主要是改变每个ItemView的layout方法中第二个参数(top)的值。这个值每次递增的量(或者说下一个Itemview的top值)为:preItemView.getBottom() + mDividerHeight(该变量为ListView中ItemView之间的间隔).

    简单的图例:



    ListView的布局类型(layoutMode)有好几个,这里就从自上而下的布局开始讲起,布局涉及到的方法调用简单脉络可以表示为layoutChildren()--->fillFromTop(nextTop )-->fillDown(position,nextTop)-->makeAndaddView(position, nextTop,....)-->setupChild(child, position, nextTop, .., ......)-->view.layout(left,top,right,bottom);通过这个方法脉络可以看出nextTop一直在随着这些方法传递着(貌似是废话)。其中方法position代表着Adapter中第position位置的那个ItemView,该参数最终在makeAndAddView方法中使用,其使用也很简单: child = obtainView(position, mIsScrap);只要简单的阅读源码 就知道obtainView方法中调用了adapter.getView(position,convertView,parent)方法。

     private View fillDown(int pos, int nextTop) {
            View selectedView = null;
            //获取listView的高度
            int end = (mBottom - mTop);
            if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
                end -= mListPadding.bottom;
            }
    
            /***
               循环遍历对当前child布局,并计算下一个child的layout的top值
             */
           <pre name="code" class="java"> while (nextTop < end && pos < mItemCount) {
                // is this the selected item?
                boolean selected = pos == mSelectedPosition;
                //将此child添加并布局到ListView中
                View child = makeAndAddView(pos, nextTop, true, mListPadding.left, selected);
    
                //计算下一个child的layout方法的top值
                nextTop = child.getBottom() + mDividerHeight;
                if (selected) {
                    selectedView = child;
                }
                //该参数用来表示Adapter中下一个child的位置,也就是getView方法中第一个参数
                pos++;
            }

    
    最终的布局是在setupChild方法中进行的:该方法大整体上分成两个部分,一是对先itemView进行测量(详细点击此处),二是对测量过后的View通过layout方法布局到ListView中(点击这里是关于layout的一个简单的应用);大体代码如下:
    

    private void setupChild(View child, int position, int y, boolean flowDown, int childrenLeft,
                boolean selected, boolean recycled) {
             //此处省略若干代码
    
            // Respect layout params that are already in the view. Otherwise make some up...
            // noinspection unchecked
            AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
            if (p == null) {
                p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
            }
            p.viewType = mAdapter.getItemViewType(position);
    
            if ((recycled && !p.forceAdd) || (p.recycledHeaderFooter &&
                    p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER)) {
                attachViewToParent(child, flowDown ? -1 : 0, p);
            } else {
                p.forceAdd = false;
                if (p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER) {
                    p.recycledHeaderFooter = true;
                }
                //讲child 添加到ViewGroup的数组View[] mChildren中去
                addViewInLayout(child, flowDown ? -1 : 0, p, true);
            }
    
            
            //进行测量
            if (needToMeasure) {
                int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
                        mListPadding.left + mListPadding.right, p.width);
                int lpHeight = p.height;
                int childHeightSpec;
                if (lpHeight > 0) {
                    childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
                } else {
                    childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
                }
                //开始进行测量
                child.measure(childWidthSpec, childHeightSpec);
            } else {
                cleanupLayoutState(child);
            }
    
            //获取测量后的
            final int w = child.getMeasuredWidth();
            final int h = child.getMeasuredHeight();
            //此处的y就是上文所说的nextTop
             final int childTop = flowDown ? y : y - h;
    
            if (needToMeasure) {
                final int childRight = childrenLeft + w;
                final int childBottom = childTop + h;
                //此处正是child进行布局的真正地方
                child.layout(childrenLeft, childTop, childRight, childBottom);
            } else {
                child.offsetLeftAndRight(childrenLeft - child.getLeft());
                child.offsetTopAndBottom(childTop - child.getTop());
            }
             
           //此处省略若干代码
    
     }

    到此为止,ListView的实现布局的原理就简单的写完了。不过本文到此并未结束,还需要讲一些其他的东西,比如重复利用的View以及关于ListVIew的一些小细节。通过上面的代码可发现,fillDown里面有一个方法的while循环,如下:

          while (nextTop < end && pos < mItemCount) {
                boolean selected = pos == mSelectedPosition;
                //将此child添加并布局到ListView中
                View child = makeAndAddView(pos, nextTop, true, mListPadding.left, selected);
    
                //计算下一个child的layout方法的top值
                nextTop = child.getBottom() + mDividerHeight;
                if (selected) {
                    selectedView = child;
                }
                //该参数用来表示Adapter中下一个child的位置,也就是getView方法中第一个参数
                pos++;
            }
    while循环的一个条件就是nextTop<end,这个end值代表着什么呢?源码中是end = (mBottom - mTop);,也就是ListView的高度,严格的来说是ListView可以用来布局的高度(有padding值),而nextTop的意思就不用多说了。通过nextTop<end这个限制可以知道,在ListView中并不是把Adapter中全部的ItemView一次性全部布局到ListVIew中,而是屏幕根据ItemView的高度能显示多少个ItemView就先add多少个ItemView到ListView里面去。所以ListView中getCount()和getChildCount()是两个完全不同的概念:

    getChildCount返回的是ListView中在屏幕中可看到的itemView的个数

    getCount()返回的是mItemCount,该变量是在调用setAdapter等方法的时候通过 mItemCount = mAdapter.getCount();很简单就是Adapter里面有多少个Item,mItemCount就等于多少。

    同时,我们知道getFirstVisiablePosition():获取在页面中第一个可见的View(item),也就是adapter的getView方法参数中参数position对应的值,在ListView的父类AdapterView中用mFirstPosition变量来表示,哪怕只有部分的View显示出来,也被当做第一个可见的view;getLastVisiablePosition():获取在页面中最有一个可见的View(item),哪怕只有部分的View显示出来也被当做最有一个可见的View,所以

    getLastVisiablePosition() == getFirstVisiablePosition()+getChildCount()-1


    在android中addView的时候,最终通过addViewInLayout调用了ViewGroup里面addViewInner(View child, int index, LayoutParams params, boolean preventRequestLayout)方法(该方法又调用了addInArray方法),ViewGrouup里面提供一个View的数组mChildren,在addView方法中调用了addVew(view view,index),index默认传的是-1,表明添加到View数组mChildren最后面,当index为正数的时候就把该View插入到数组中的index的位置,相应的View数组mChildren里面的元素后移;也就说说本质上ViewGroup里面的addView系列重载方法其实就是对mChilderen这个View类型的数据进行的数组插入操作。


    在setupChild方法中就调用了 addViewInLayout(child, flowDown ? -1 : 0, p, true)把Adapter中的View添加到了ViewGroup的数组中去因为在代码中有if(index<0){index=mChildren}这个处理。按照我们上面的探讨顺序,flowDown是true:也就是addInArray参数的index为-1;

     

     private void addInArray(View child, int index) {
            View[] children = mChildren;
             final int count = mChildrenCount;//获取ViewGroup
            final int size = children.length;
            if (index == count) {
                if (size == count) {
                    mChildren = new View[size + ARRAY_CAPACITY_INCREMENT];
                    System.arraycopy(children, 0, mChildren, 0, size);
                    children = mChildren;
                }
                children[mChildrenCount++] = child;
            } else if (index < count) {
                if (size == count) {
                    mChildren = new View[size + ARRAY_CAPACITY_INCREMENT];
                    System.arraycopy(children, 0, mChildren, 0, index);
                    System.arraycopy(children, index, mChildren, index + 1, count - index);
                    children = mChildren;
                } else {
                    System.arraycopy(children, index, children, index + 1, count - index);
                }
                children[index] = child;
                mChildrenCount++;
                if (mLastTouchDownIndex >= index) {
                    mLastTouchDownIndex++;
                }
            } else {
                throw new IndexOutOfBoundsException("index=" + index + " count=" + count);
            }
        }

    因为getChildAt(int index)就是从数组mChildren获取返回对应索引的View:return mChildren[index],所以需要注意的是:在ListView中,使用getChildAt(index)的取特定位置的View的时候,index的取值范围是 index>=getFristVisiblePosition()&&index<==getlastVisiablePosition();超出此范围的话getChildAt会返回null;

    另外AdapterView里面mSelectedPosition这个变量,代表着当前ListView中选中的ItemView所在的位置,对应的是该ItemView在getView中position的值);而AbsListView中的方法getSelectedView返回也是mChildren数组里面对应位置的View,所以这样的话getSelectedView返回的View=mChildren[mSelectionPosition-mFirstPosition]就不难理解了。

      public View getSelectedView() {
            if (mItemCount > 0 && mSelectedPosition >= 0) {
                return getChildAt(mSelectedPosition - mFirstPosition);
            } else {
                return null;
            }
        }
    public View getChildAt(int index) {
            if (index < 0 || index >= mChildrenCount) {
                return null;
            }
            return mChildren[index];
        }
    
    
    

    到此位置,ListView的布局就算是告一段落,通过读取里面的代码加深理解和学到不少的知识,写了这么多貌似有点啰嗦,

    简单总结一下:

    1)ListView的layout只是循环遍历Adapter中的View,通过累加layout方法的top参数的值来把一个个itemView 布局我们所见到的的那些效果

    2)每次布局的时候,只是向ListView的mChildren数组中(该数组在ListView的父类ViewGroup中定义)添加Adapter中的部分ItemView,而不是全部。getChildAt方法和getSelectedView方法都是从mChildren数组中获取到对应的View返回之。

    最后丢一个简单的疑问:

    1)既然每次addView的时候不把全部的ItemView添加完,那么其余的itemView是什么时候,怎么添加进来的呢?

    2)在添加新的itemView之前或者之后对mChildren数组都做了怎样的操作,这种操作的时机和目的是什么?

    这些问题将在下一篇博客:《ListIView乱谈之ListView的滚动》详细解答



    展开全文
  • 之前用数据读取器将数据填充到ListView中 代码如下 listView1.Items.Clear(); SqlConnection con = new SqlConnection("server=.;UID=sa;PWD=1234;database=XXXX"); con.Open(); SqlCommand cmd = new ...
  • 解决ListView嵌套ListView遇到的问题

    千次阅读 2014-06-13 20:45:30
    Listview嵌套会造成的问题主要是子listview的高度错误导致内容不能正常显示完,解决这个问题,我个人第一个想法就是重新计算子listview的高度,代码如下: private void setListViewHeightBasedOnChildren(ListView...

    Listview嵌套会造成的问题主要是子listview的高度错误导致内容不能正常显示完,解决这个问题,我个人第一个想法就是重新计算子listview的高度,代码如下:

    private void setListViewHeightBasedOnChildren(ListView listView) { 
        if(listView == null) return;
    
        ListAdapter listAdapter = listView.getAdapter(); 
        if (listAdapter == null) { 
            return; 
        } 
    
        int totalHeight = 0; 
        for (int i = 0; i < listAdapter.getCount(); i++) { 
            View listItem = listAdapter.getView(i, null, listView); 
            listItem.measure(0, 0); 
            totalHeight += listItem.getMeasuredHeight(); 
        } 
    
        ViewGroup.LayoutParams params = listView.getLayoutParams(); 
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
        listView.setLayoutParams(params); 
    }
    

    父listview的adapter中getview方法调用

    RelationAdapter relationAdapter = new RelationAdapter(context, model.relations);cell.xlistView.setAdapter(relationAdapter);setListViewHeightBasedOnChildren(cell.xlistView);

    注意事项:

    Adapter中getView方法返回的View的必须由LinearLayout组成,因为只有LinearLayout才有measure()方法,如果使用其他的布局如RelativeLayout,在调用listItem.measure(0, 0);时就会抛异常。

    效果图:

    展开全文
  • View listView = view.findViewById(R.id.listView1); String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", ...
  • 1.ListView嵌套ListView 或者RecyclerView嵌套ListView都只能显示一行,原因是不知ListView的高是多少,如果完全显示嵌套的ListView,则需要修改ListView的测量规则 public class MyListView extends ListView { ...
  • 我的想法是子view(就是ListView的item)中onTouch()返回true,那么ListView就应该接收不到MotionEvent,也就不能滚动了,而事实并非如此,不知道原因。 public class MainActivity extends ActionBarActivity { ...

空空如也

1 2 3 4 5 ... 20
收藏数 89,086
精华内容 35,634
关键字:

listview