不知道为什么的请再次发动你的大脑。
if (mListener.isStickyPosition(firstVisibleItem + 1)) { // 如果第二个可见的item是Sticky的 // 开始推的效果,即HeadView不再显示在原点 // HeadView的Bottom为第二个可见的item的Top // HeadView的Top为Bottom减去HeadView的高 int headBottom = getChildAt(1).getTop(); int headTop = headBottom - mHeadView.getMeasuredHeight(); Log.e("headBottom", headBottom + ""); Log.e("headTop", headTop + ""); mHeadView.layout(0, headTop, mHeadView.getMeasuredWidth(), headBottom); mListener.onHeadViewChange(mHeadView, firstVisibleItem, visibleItemCount, totalItemCount); }(8)外部需要设置的东西
首先是需要两个布局文件,一个是ListView的item的布局文件,一个是HeadView文件,并且HeadView要长得跟item布局的左侧完全一样。我就不贴布局文件了,想看的下载Demo看吧。
然后最重要的是实现一个StickyListener并设置给JJJStickyListView。
StickyListener stickyListener = new StickyListener() { @Override public void onHeadViewChange(View hView, int firstP, int vCount, int tCount) { for (int i = firstP; i >= 0; i--) { if (isStickyPosition(i)) { TextView tvTextView = (TextView) hView.findViewById(R.id.tv_time); tvTextView.setText(datas.get(i).getTime()); break; } } } @Override public boolean isStickyPosition(int pos) { return datas.get(pos).isShowTime; } @Override public View getHeadView() { //提供HeadView View headerView = (ViewGroup) getLayoutInflater().inflate(R.layout.head, null); headerView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); return headerView; } @Override public int getHeadViewWidthInDp() { return 100; } @Override public int getHeadViewHeightInDp() { return 100; } };几点注意:
<1>onHeadViewChange方法在HeadView的内容需要更新时被回调,至于新的内容应该是什么需要根据你的数据源来判断,还不是很明白的可以下载Demo再研究一下。
<2>isStickyPosition同样需要根据你的数据源来实现。
<3>getHeadView方法需要为HeadView设置一个LayoutParams,生成LayoutParams的参数随便,因为我们已经提供了HeadView的宽和高并用其作为参数给HeadView测量,所以LayoutParams不会影响到HeadView的大小,但在测量过程中会需要到它,如果不设置的话会报空指针异常。
注:Demo里用了一个SmartAdapter,看不懂的话参考: Android好奇宝宝_04_一个有3个功能的Adapter
Demo下载
Tags:Android Sticky ListView Android-好奇宝宝系列