利用ListView的基本方法实现效果

gnil4338 7年前
   <p>日常的开发工作经常需要ListView作为布局的组件,而且很多时候都会遇到需要自定义ListView的情况。</p>    <p>也有些问题并不需要自定义的ListView,基于原生的ListView就能实现,但需要灵活处理Adapter。</p>    <p>我们现在就遇到一个棘手的问题:原本的下拉刷新ListView是单个item的刷新,现在要改成一行两个item,照道理来讲,这应该是一个GridView,但是要考虑兼容以往的下拉刷新效果,要重新定义一个这样的GridView是比较困难的,因为打算基于原生的ListView进行改造,因为原本的下拉刷新ListView本身就是ListView的子类。</p>    <p>一个明显的改变就是在Adapter的getCount()。</p>    <p>这个方法返回的是ListView一共要显示的item的数目,但是因为现在已经改成一行显示两个item,所以实际显示的数目应该除以2的,但考虑到如果数据源是奇数的问题,所以代码如下:</p>    <pre>  <code class="language-java">   @Override      public int getCount() {          int size = list.size();          if(size % 2 == 0){              return size / 2;          }else{              return size / 2 + 1;          }      }  </code></pre>    <p>然后我们在处理getView的时候必须要注意,现在这个position代表的意思和以前不一样。</p>    <p>以前的position为0的时候,表示是第一个元素,但这里我们在getCount里面处理过了,所以返回0其实是表示返回第一个和第二个元素。</p>    <p>如果position为0,取的是0和1,如果为1,取的是2和3,为2,取的是4和5。。。以此类推,我们在取的时候,要position * 2和position * 2 + 1,表示取出一行左边和右边的item的数据。</p>    <p>我们必须注意奇数时候取到最后一个数据的情况。</p>    <p>我们可以判断position * 2 + 1是否小于数据的数量,如果大于,说明是取到最后一个数据了,就要隐藏掉右边的Item。</p>    <p>这样我们就实现了一个ListView一行显示两列的情况。</p>    <p>涉及到getCount中的修改,一般都是类似这种,一行显示多个item的情况,但是我们并不建议在处理类似的情况的时候搞得这么复杂,如果能够用GrideView或者RecyclerView就用,如果是类似我们这种,因为之前的业务关系,导致必须在已有的ListView上修改,就可以采取这种做法。</p>    <p>ListView作为一个可滑动的控件,有很多效果都要求在滑到某个位置时候要做出某种响应。这类效果的实现可以很复杂,也可以稍微简单,视具体情况而言。</p>    <p>我们遇到的需求是要求ListView在某个控件滑出屏幕的时候,标题栏要显示某个控件。</p>    <p>这个需求并不算是特别复杂,我们只要判断滑出屏幕的控件的坐标位置就行。</p>    <p>所有可以滑动的控件的滑动监听都可以在onScroll方法里。</p>    <p>要判断某个控件是否滑出屏幕,我们先要知道屏幕的范围。</p>    <pre>  <code class="language-java">1 Point p = new Point();  2 getWindowManager().getDefaultDisplay().getSize(p);  3 int screenWidth = p.x;  4 int screenHeight = p.y;  5 Rect rect = new Rect(0, 0, screenWidth, screenHeight);  </code></pre>    <p>这个Rect就是屏幕的坐标范围。</p>    <p>然后我们获取某个控件的坐标范围。</p>    <pre>  <code class="language-java">int[] location = new int[2];  view.getLocationInWindow(location);  </code></pre>    <p>这个控件的坐标范围就放在location里面。</p>    <p>然后我们判断某个控件是否在某个范围可见,也就是Rect内可见,可以调用这个方法:</p>    <pre>  <code class="language-java">view.getLocalVisibleRect(rect)  </code></pre>    <p>任何复杂的效果,都是建立在基础控件的基本属性和方法上,虽然实现上会比较琐屑,但是我们看到的那些简单的方法调用,其封装的实现也是很琐屑的。</p>    <p>Android中涉及到控件的一些特别效果,尤其是涉及到坐标变化,都需要我们特别细心的对待,只要找到思路,还是有方法实现的。</p>    <p> </p>    <p>来自:http://www.cnblogs.com/wenjiang/p/6031330.html</p>    <p> </p>