先看效果图:
适用listview recycleview 滑动流畅,无BUG
上代码,直接写在adapter里
private final int MAX_LINE_COUNT = 3;//最大显示行数 private final int STATE_UNKNOW = -1;//未知状态 private final int STATE_NOT_OVERFLOW = 1;//文本行数小于最大可显示行数 private final int STATE_COLLAPSED = 2;//折叠状态 private final int STATE_EXPANDED = 3;//展开状态 private SparseArray<Integer> mTextStateList;//保存文本状态集合
在绑定视图(我用的recycleview)onBindViewHolder中
int state = mTextStateList.get(position, STATE_UNKNOW); if (state == STATE_UNKNOW) { myViewHolder.homeContent.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { //这个回掉会调用多次,获取玩行数后记得注销监听 myViewHolder.homeContent.getViewTreeObserver().removeOnPreDrawListener(this); //如果内容显示的行数大于限定显示行数 if (myViewHolder.homeContent.getLineCount() > MAX_LINE_COUNT) { myViewHolder.homeContent.setMaxLines(MAX_LINE_COUNT);//设置最大显示行数 myViewHolder.homeShowOrHide.setVisibility(View.VISIBLE);//让其显示全文的文本框状态为显示 myViewHolder.homeShowOrHide.setText("[全文]");//设置其文字为全文 mTextStateList.put(position, STATE_COLLAPSED); } else { myViewHolder.homeShowOrHide.setVisibility(View.GONE);//显示全文隐藏 mTextStateList.put(position, STATE_NOT_OVERFLOW);//让其不能超过限定的行数 } return true; } }); } else { // 如果之前已经初始化过了,则使用保存的状态,无需在获取一次 switch (state) { case STATE_NOT_OVERFLOW: myViewHolder.homeShowOrHide.setVisibility(View.GONE); break; case STATE_COLLAPSED: myViewHolder.homeContent.setMaxLines(MAX_LINE_COUNT); myViewHolder.homeShowOrHide.setVisibility(View.VISIBLE); myViewHolder.homeShowOrHide.setText("[全文]"); break; case STATE_EXPANDED: myViewHolder.homeContent.setMaxLines(Integer.MAX_VALUE); myViewHolder.homeShowOrHide.setVisibility(View.VISIBLE); myViewHolder.homeShowOrHide.setText("[收起]"); break; } } myViewHolder.homeShowOrHide.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int state = mTextStateList.get(position, STATE_UNKNOW); if (state == STATE_COLLAPSED) { myViewHolder.homeContent.setMaxLines(Integer.MAX_VALUE); myViewHolder.homeShowOrHide.setText("[收起]"); mTextStateList.put(position, STATE_EXPANDED); } else if (state == STATE_EXPANDED) { myViewHolder.homeContent.setMaxLines(MAX_LINE_COUNT); myViewHolder.homeShowOrHide.setText("[全文]"); mTextStateList.put(position, STATE_COLLAPSED); } } }); myViewHolder.homeContent.setText(homeInformation.getSummary());//设置数据
myViewHolder.homeContent 换成自己的TextView文本控件名称就OK了
myViewHolder.homeShowOrHide是显示[全文]或[收起] 的Textview控件