仿QQ空间说说TextView内容显示、收起

         这几天做项目遇到需要像QQ空间发表说说内容,当内容超过指定的行数后,后面的内容就不显示。而是显示一个“显示全文”按钮,点击时候才展开所有内容。此时变成“收起”按钮,点击收起内容。

在网上找了几个例子都是单独的一个简单Demo,放在ListView或多或少会出现一些问题。

为了让大家少走点弯路,我在这边直接将我放在ListView里面的Demo在这边记录下。与大家交流学习~

public class MyTextView extends FrameLayout {

	TextView contentView; // 内容文本
	TextView openView; // “显示全文”或“收起”文本
	protected boolean isExpand = false; // 显示或收起标记
	private int defaultLine = 2; // 显示的行数,超过就隐藏

	public MyTextView(Context context) {
		super(context);
		LayoutInflater.from(context).inflate(R.layout.text_layout, this);
		contentView = (TextView) findViewById(R.id.content_text);
		openView = (TextView) findViewById(R.id.open_view);

		// 监听显示或收起按钮事件
		openView.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				isExpand = !isExpand;
				if (onStateChangeListener != null) {
					onStateChangeListener.onStateChange(isExpand);
				}
				if (isExpand) {
					contentView.setLines(contentView.getLineCount());
					openView.setText("收起");
				} else {
					contentView.setLines(defaultLine);
					openView.setText("展开显示");
				}
			}
		});
	}

	// 给内容文本框赋值
	public void setText(String str) {
		contentView.setText(str);

		int count = contentView.getLayout() == null ? getLineNumber()
				: contentView.getLineCount();
		if (count > defaultLine) {
			contentView.setLines(defaultLine);
			openView.setVisibility(View.VISIBLE);
		} else {
			openView.setVisibility(View.GONE);
		}
	}

	// 计算内容文本框的占用的行数
	private int getLineNumber() {
		WindowManager wm = (WindowManager) getContext().getSystemService(
				Context.WINDOW_SERVICE);
		int width = wm.getDefaultDisplay().getWidth(); //获取屏幕的宽度

		int widthMeasureSpec = MeasureSpec.makeMeasureSpec(width,
				MeasureSpec.AT_MOST);
		int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0,
				MeasureSpec.UNSPECIFIED);
		contentView.measure(widthMeasureSpec, heightMeasureSpec);
		int lineHeight = contentView.getLineHeight(); //单行文本的高度
		int lineNumber = contentView.getMeasuredHeight() / lineHeight;  //文本内容所占的行数
		return lineNumber;
	}

	// 改变状态的接口
	public interface OnStateChangeListener {
		void onStateChange(boolean isExpand);
	}

	public OnStateChangeListener onStateChangeListener;

	public void setOnStateChangeListener(
			OnStateChangeListener onStateChangeListener) {
		this.onStateChangeListener = onStateChangeListener;
	}

	// 改变当前标记的值,并判断当前处于何种状态
	public void setIsExpand(boolean isExpand) {
		this.isExpand = isExpand;
		if (isExpand) {
			contentView.setLines(contentView.getLineCount());
			openView.setText("收起");
		} else {
			contentView.setLines(defaultLine);
			openView.setText("展开显示");
		}
	}
}

在适配器里面的getView方法,主要是让大家知道如何使用这个MyTextView.

public View getView(int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			convertView = new MyTextView(context);
		}
		final TModel tmodel = getItem(position);
		((MyTextView) convertView).setText(getItem(position).content); 
		((MyTextView) convertView)
				.setOnStateChangeListener(new OnStateChangeListener() {

					@Override
					public void onStateChange(boolean isExpand) {
						tmodel.isExpand = isExpand;
					}
				});
		((MyTextView) convertView).setIsExpand(tmodel.isExpand);
		return convertView;
	}


代码我都有简单做了注释,小小Demo也没什么值得详细解释的地方。

下方我放出运行时的界面,大家可以看下是不是符合你们需求,自己稍加修改便可使用。

Demo下载地址:

http://download.csdn.net/download/dai_jiawei/9181603  (原谅我无耻的收取1分资源分。如果没分数的留言找我要吧。有分数的就贡献一分给我吧,下完你们根据使用情况评论下分数也就回来了。)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值