效果如下:( 点击下载演示)

本人已经开源到了TaoCode,可以使用SVN免费更新下来:http://code.taobao.org/svn/nestlistview/trunk

实现原理:顶部利用了ListView的HeadView来实现,然后其他每个item都用背景实现!

首先设置一些常量:

public class NestHelper {

public static final int BACK_COLOR = 0xFFF8F3D5;// 背景色

public static final int LINE_COLOR = 0xFF5A595A;// 线颜色

public static final int LINE_WIDTH = 2;// 线的宽度(要偶数)

public static final int LINE_SPAN = 4;// 线的间距

}

每个项目的背景实现最为核心,请看代码:

public class NestItemLayout extends FrameLayout implements NestNotifyData {

public NestItemLayout(Context context) {

super(context);

}

public NestItemLayout(Context context, AttributeSet attrs) {

super(context, attrs);

}

public NestItemLayout(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@SuppressWarnings("deprecation")

@Override

public void notifyDataSetChanged(int count, int position) {

setBackgroundDrawable(new NestDrawable(count, position));

}

/** 绘制item Layout背景 两边跟底部 */

class NestDrawable extends Drawable {

private int linsCount = 0;// 两边各有多少条线

private int span = 0;// 一条线的宽度(线加线之间距)

public NestDrawable(int count, int position) {

linsCount = count - position;

if (linsCount > 5) {

linsCount = 5;// 一边最多5条

}

span = (NestHelper.LINE_WIDTH + NestHelper.LINE_SPAN);

setPadding(span * linsCount, 0, span * linsCount,

NestHelper.LINE_WIDTH);

}

@Override

public void draw(Canvas canvas) {

canvas.drawColor(NestHelper.BACK_COLOR);

Paint paint = new Paint();

paint.setColor(NestHelper.LINE_COLOR);

paint.setStrokeWidth(NestHelper.LINE_WIDTH);

// 绘制底部线

canvas.drawLine(span * (linsCount - 1), getHeight()

- NestHelper.LINE_WIDTH / 2, getWidth() - span

* (linsCount - 1), getHeight() - NestHelper.LINE_WIDTH / 2,

paint);

for (int i = 0; i < linsCount; i++) {

// 绘制左边线

canvas.drawLine(span * i + NestHelper.LINE_WIDTH / 2, 0, span

* i + NestHelper.LINE_WIDTH / 2, getHeight(), paint);

// 绘制右边线

canvas.drawLine(getWidth() - span * i - NestHelper.LINE_WIDTH

/ 2, 0, getWidth() - span * i - NestHelper.LINE_WIDTH

/ 2, getHeight(), paint);

;

}

}

@Override

public void setAlpha(int alpha) {

}

@Override

public void setColorFilter(ColorFilter cf) {

}

@Override

public int getOpacity() {

return 0;

}

}

}

最后重写ListView控件:

public class NestListView extends ListView implements NestNotifyData {

private NestHeadView headView;

public NestListView(Context context) {

super(context);

initView();

}

public NestListView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

public NestListView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

initView();

}

private void initView() {

headView = new NestHeadView(getContext());

addHeaderView(headView);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

@Override

public void notifyDataSetChanged(int count, int position) {

headView.notifyDataSetChanged(count, position);

}

public NestNotifyData getNotifyData() {

return this;

}

}

Adatper:

package com.cyy.nestlistview;

import java.util.List;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;

import com.cyy.widget.NestNotifyData;

/**

* @see http://blog.csdn.net/chenlove1

* @author chenyingyou

*

*/

public class NestAdapter extends BaseAdapter {

private List list;

private Context context;

public NestAdapter(Context context, List list) {

this.list = list;

this.context = context;

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

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

if (null == convertView) {

convertView = LayoutInflater.from(context).inflate(

R.layout.item_nest, null);

}

((TextView) convertView.findViewById(R.id.tv_item)).setText(list

.get(position));

if (convertView instanceof NestNotifyData) {

((NestNotifyData) convertView).notifyDataSetChanged(list.size(),

position);

}

return convertView;

}

}

android 评论盖楼,Android 使用ListView实现网易评论盖楼效果相关推荐

  1. Android网易评论盖楼效果实现

    下面是一个主要的方法: /** * 递归加载楼层的方法 * * @param context上下文的对像 * @param 递归的控制参数 * ,同时也是取用户评论信息和背景色的下标,引参数的大小必须 ...

  2. android微信点赞ui,Android中使用PopupWindow 仿微信点赞和评论弹出

    微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具 ...

  3. android 微信点赞功能,Android 仿微信点赞和评论弹出框

    wjntekaqskfhwktpgpvzhp 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 左下角的"更多"按钮: 点击该按钮后弹出的对话框: 微信朋友圈点赞和评 ...

  4. Android评论工具类,实现QQ空间文字评论效果

    方便使用的评论工具类,而且能监听到小键盘消失事件,能返回小键盘的高度,追踪评论位置. 只是评论功能,木有表情等其他的东东(表情目前都用VP+GV写的,正在尝试使用一个VIew来做分页) 具体文件中有注 ...

  5. [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市

    Material Design中文版Code4APPPHP100UI4APP 开启辅助访问设为首页收藏本站快捷导航切换到宽版切换风格 石刚 | |我的 |签到打卡 |设置 |消息 |提醒(2) |退出 ...

  6. android开发 一个更优的listView的写法

    android开发 一个更优的listView的写法 布局xml <?xml version="1.0" encoding="utf-8"?> &l ...

  7. android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)...

    1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为        2,为了使LISTVIEW的ITEM在点 ...

  8. android开发小技巧:实现listview异步加载图片

    2019独角兽企业重金招聘Python工程师标准>>> 针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师 ...

  9. 我的Android进阶之旅------Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

最新文章

  1. 4-20模块 序列化模块 hashlib模块
  2. Java 集合系列06: Vector深入解析
  3. poj12652954 [皮克定理 格点多边形]【学习笔记】
  4. boost::transform_iterator用法的测试程序
  5. Android 动画效果及Interpolator和AnimationListener的使用
  6. 第一次给知名项目贡献代码,有点紧张
  7. 【debug】python打包成exe,太大了该怎么解决?
  8. linux 下自动重启tomcat的脚本(支持shell杀进程)
  9. 安装nginx、drizzle和lua
  10. PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现
  11. 百变方块java代码_多牛百变方块
  12. Linux之iNodeclient客户端定制和安装
  13. 真鱼游来游去动态壁纸_真鱼动态壁纸
  14. 银行那些事儿--银行会计
  15. linux获取ip上网,linux dhcp 获取ip地址能上网,设置静态ip地址则不能上网
  16. 怎么实现在FireFox IE Opera Safari 都可以正常播放WMV和MOV的网页播放器代码
  17. Linux中升级GLIBC,终结版,测试通过
  18. 浅谈MySQL Binlog
  19. 上半年要写的博客文章30
  20. 可扩展java游戏框架实践之java飞机大战

热门文章

  1. 角谷定理python每次输出数_角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。...
  2. 艾美捷硝酸盐/亚硝酸盐荧光法检测试剂盒基本参数说明
  3. 总结HTTP中常见的一些名词
  4. 程序员的自我修养,陈逸鹤
  5. java计算机毕业设计综合测评系统源码+数据库+系统+lw文档+mybatis+运行部署
  6. 【Markdown】上下标
  7. 处理新浪微博中@ #等格式 蓝色高亮~ 表情 以及点击事件
  8. [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject
  9. 华为电脑linux指纹,华为朱臣才:MateBook指纹解锁仅需一触
  10. centos 7 jenkins一健发布asp.net项目