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

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

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

0818b9ca8b590ca3270a3433284dd417.png

实现原理:顶部利用了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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值