PinnedSectionListView:分组的listView滑动中固定组标题的实现

 

PinnedSectionListView:分组的listView滑动中固定组标题的实现


http://blog.csdn.net/jdsjlzx/article/details/20697257




  分类:
   

在很多应用中,看到这样的listview:listview滑动过程中分组标题固定在上方,当第二个组滑上来时,第一个组才跟着上滑,下一个组固定,直到该组也滑出上边缘。世上无难事只怕有心人,在github上就有人做出来了,而且效果很好(后来发现安卓自带应用中联系人应用就是这样的,估计github的作者也是仿照着联系人做出来的吧)。

先看截图:

    



PinnedSectionListView继承自listview,众所周知listview的每个子view都是按顺序跟着滚动的,要实现联系人listview的效果还真的找不到思路。看了PinnedSectionListView之后,感觉要改造一个现有的控件,一般都是通过重绘子view来实现的。ViewGroup(ListView继承自它)重绘子view的方法是dispatchDraw。

看看PinnedSectionListView在dispatchDraw中有那些特别的处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Override
protected void dispatchDraw(Canvas canvas) {
     super .dispatchDraw(canvas);
     if (mPinnedSection != null ) {
         // prepare variables
         int pLeft = getListPaddingLeft();
         int pTop = getListPaddingTop();
         View view = mPinnedSection.view;
         // draw child
         canvas.save();
         int clipHeight = view.getHeight() +
                 (mShadowDrawable == null ? 0 : Math.min(mShadowHeight, mSectionsDistanceY));
         canvas.clipRect(pLeft, pTop, pLeft + view.getWidth(), pTop + clipHeight);
         canvas.translate(pLeft, pTop + mTranslateY);
         drawChild(canvas, mPinnedSection.view, getDrawingTime());
         if (mShadowDrawable != null && mSectionsDistanceY > 0) {
             mShadowDrawable.setBounds(mPinnedSection.view.getLeft(),
                     mPinnedSection.view.getBottom(),
                     mPinnedSection.view.getRight(),
                     mPinnedSection.view.getBottom() + mShadowHeight);
             mShadowDrawable.draw(canvas);
         }
         canvas.restore();
     }
}

关键在于canvas.translate(pLeft, pTop + mTranslateY);意思是在绘制mPinnedSection的时候,listview滑动了多长的距离,就将canvas移动多少的距离,使mPinnedSection始终在可见的范围内固定不变。


使用方法:

1.在xml布局文件中将ListView替换成PinnedSectionListView

1
2
3
4
5
<com.hb.views.PinnedSectionListView
     android:id= "@android:id/list"
     android:layout_width= "match_parent"
     android:layout_height= "wrap_content"
     />

2.让你的ListAdapter继承PinnedSectionListAdapter接口,最简单的做法是只增加isItemViewTypePinned方法,该方法必须在item为pinned的情况下返回true。

1
2
3
4
5
6
7
8
9
// Our adapter class implements 'PinnedSectionListAdapter' interface
class MyPinnedSectionListAdapter extends BaseAdapter implements PinnedSectionListAdapter {
      ...
      // We implement this method to return 'true' for all view types we want to pin
      @Override
      public boolean isItemViewTypePinned(int viewType) {
          return viewType == <type to be pinned>;
      }
}

 项目地址:https://github.com/beworker/pinned-section-listview


最后推荐一个demo:http://blog.csdn.net/anddroid_lanyan/article/details/41895631






http://blog.csdn.net/anddroid_lanyan/article/details/41895631
http://blog.csdn.net/anddroid_lanyan/article/details/41895631

 

Android PinnedSectionListView 收缩

标签: androidlistView
  2445人阅读  评论(9)  收藏  举报
  分类:

网上开源项目:https://github.com/beworker/pinned-section-listview,该项目用的是ArrayAdapter()..不太适合我,稍作修改,仿的微信界面

PinnedSectionListView修改了一行代码,不然会报错,代码如下

void createPinnedShadow(int position) {}》》

[java]  view plain  copy
  1. if (layoutParams == null) {  
  2.            //layoutParams = (LayoutParams) generateDefaultLayoutParams();  
  3.             layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
  4.             pinnedView.setLayoutParams(layoutParams);  
  5.         }  




http://blog.csdn.net/zhangphil/article/details/50054555
http://blog.csdn.net/zhangphil/article/details/50054555

 

Android PinnedSectionListView异常崩溃报错

标签: android
  331人阅读  评论(0)  收藏  举报
  分类:
Android PinnedSectionListView异常崩溃报错:java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams


Android PinnedSectionListView是一个良好的第三方开源悬停分组ListView,其在github上的项目主页是:https://github.com/beworker/pinned-section-listview ,在涉及到一些联系人分组,好友分组等需要对ListView进行分组的情况下,使用起来效果不错。
但是作为开源项目,本身也在不停的迭代和完善中,最近(截止2015年11月26日)发现PinnedSectionListView在一些Android SDK版本中运行时候异常崩溃报错,如图:



报错的关键内容是:
[plain]  view plain  copy
  1. java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams  

错误内容提示在PinnedSectionListView.Java的202行出现错误,这是PinnedSectionListView.java源代码中的原始内容:

[java]  view plain  copy
  1. // read layout parameters  
  2.         LayoutParams layoutParams = (LayoutParams) pinnedView.getLayoutParams();  
  3.         if (layoutParams == null) {  
  4.             layoutParams = (LayoutParams) generateDefaultLayoutParams();  
  5.             pinnedView.setLayoutParams(layoutParams);  
  6.         }  

如图:



经由研究发现,此原因是在调用Android系统的generateDefaultLayoutParams()方法时候,发生异常,致使代码运行获得的结果layoutParams不正常,进而导致PinnedSectionListView崩溃。


解决方案:
自己动手重写Android系统的generateDefaultLayoutParams()方法,返回自己定制的LayoutParams值。

具体实现:
在PinnedSectionListView.java中增加自己重写的generateDefaultLayoutParams()方法:

[java]  view plain  copy
  1. //add by Zhang Phil @CSDN  
  2.    @Override  
  3.    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {  
  4.       
  5.     LayoutParams mLayoutParams=new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
  6.       
  7.     return mLayoutParams;  
  8.    }  







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值