android:id="@+id/tv_content_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/content_margin"
android:text="全文"
android:textColor="@color/colorPrimaryDark"
android:textSize="14sp" />
2:然后是adapter(提示本adapter是经过封装的,方便快速开发,同学们拷贝关键代码即可),如下
public class FindAttenionAdapter extends CommonAdapter {
private Context context;
/**
* 注意:保存文本状态集合的key一定要是唯一的
*/
private SparseArray mTextStateList;//保存文本状态集合
public FindAttenionAdapter(Context context, List datas) {
super(context, R.layout.item_find_content, datas);
this.context = context;
mTextStateList = new SparseArray<>();
}
@Override
protected void convert(ViewHolder viewHolder, FindContentBean item, int position) {
//文本内容
TextView tvContent = viewHolder.getView(R.id.tv_content);
//文本是否显示全部
TextView tvContentStatus = viewHolder.getView(R.id.tv_content_status);
int state = mTextStateList.get(position, Constant.TextFolderStatus.STATE_UNKNOW);
if (state == Constant.TextFolderStatus.STATE_UNKNOW) {
tvContent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
//这个回掉会调用多次,获取完行数后记得注销监听
tvContent.getViewTreeObserver().removeOnPreDrawListener(this);
if (tvContent.getLineCount() > Constant.TextFolderStatus.MAX_LINE_COUNT) {
tvContent.setMaxLines(Constant.TextFolderStatus.MAX_LINE_COUNT);//设置最大显示行数
tvContentStatus.setVisibility(View.VISIBLE);//显示“全文”
tvContentStatus.setText("全文");
mTextStateList.put(position, Constant.TextFolderStatus.STATE_COLLAPSED);//保存状态
} else {
tvContentStatus.setVisibility(View.GONE);
mTextStateList.put(position, Constant.TextFolderStatus.STATE_NOT_OVERFLOW);
}
return true;
}
});
tvContent.setMaxLines(Integer.MAX_VALUE);//设置文本的最大行数,为整数的最大数值
tvContent.setText(item.getContent());//设置内容
} else {
//如果之前已经初始化过了,则使用保存的状态。
switch (state) {
case Constant.TextFolderStatus.STATE_NOT_OVERFLOW:
tvContentStatus.setVisibility(View.GONE);
break;
case Constant.TextFolderStatus.STATE_COLLAPSED:
tvContent.setMaxLines(Constant.TextFolderStatus.MAX_LINE_COUNT);
tvContentStatus.setVisibility(View.VISIBLE);
tvContentStatus.setText("全文");
break;
case Constant.TextFolderStatus.STATE_EXPANDED:
tvContent.setMaxLines(Integer.MAX_VALUE);
tvContentStatus.setVisibility(View.VISIBLE);
tvContentStatus.setText("收起");
break;
}
tvContent.setText(item.getContent()); //设置显示的内容
}
tvContentStatus.setOnClickListener(v -> {
int mState = mTextStateList.get(position, Constant.TextFolderStatus.STATE_UNKNOW);
if (mState == Constant.TextFolderStatus.STATE_COLLAPSED) {
tvContent.setMaxLines(Integer.MAX_VALUE);
tvContentStatus.setText("收起");
mTextStateList.put(position, Constant.TextFolderStatus.STATE_EXPANDED);
} else if (mState == Constant.TextFolderStatus.STATE_EXPANDED) {
tvContent.setMaxLines(Constant.TextFolderStatus.MAX_LINE_COUNT);
tvContentStatus.setText("全文");
mTextStateList.put(position, Constant.TextFolderStatus.STATE_COLLAPSED);
}
});
}
}
3:附上Constant.class---->这个文件作为全局变量,只要在一个地方修改就可以实现全局控制啦。(注意这是一个
interface而不是class哦)
public interface Constant {
/**
* 文本收起或者全文状态
*/
interface TextFolderStatus {
int MAX_LINE_COUNT =5;//最大显示行数
int STATE_UNKNOW = -1;//未知状态
int STATE_NOT_OVERFLOW = 1;//文本行数小于最大可显示行数
int STATE_COLLAPSED = 2;//折叠状态
int STATE_EXPANDED = 3;//展开状态
}
}
4:最后附上两张效果图
