这几天做项目遇到需要像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下载地址:
http://download.csdn.net/download/dai_jiawei/9181603 (原谅我无耻的收取1分资源分。如果没分数的留言找我要吧。有分数的就贡献一分给我吧,下完你们根据使用情况评论下分数也就回来了。)