Android实现类似朋友圈显示全文的功能

标签:android

项目中要实现一个类似朋友圈显示收起全文的功能,这个功能看起来简单,但对于我这个新手来说确实费了些时间。 首先,在adpter_item.xml中定义textview的lines=”3”,然后定义个“全文”按钮,默认不显示,如下:

    <TextView
        android:id="@+id/contentTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="5dip"
        android:paddingTop="5dip"
        android:ellipsize="end"
        android:lines="3"
        android:textColor="@color/color_232323"
        android:textSize="14sp" />
    <TextView
        android:id="@+id/showAllTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="5dip"
        android:paddingTop="5dip"
        android:textColor="@color/bule_02"
        android:text="全文"
        android:visibility="gone"
        android:textSize="14sp" />
    

重点就是,怎样判断当前的textview里的全部文字是不是能够显示三行以上,再把showAllTv显示出来呢?textview确实有个getLineCount方法可以获得显示的行数,但是这个值只能控件绘画后才能获取,Adapter的getView中获得的行数全部为0,因为控件还没有绘画。我在百度之后发现以下方法是比较靠谱的,就是对textview的绘画事件进行监听,在绘画完成前判断行数并修改相关控件属性,代码如下:

final TextView fContentTv = holder.contentTv;
final TextView fShowAllTv = holder.showAllTv;
ViewTreeObserver vto =fContentTv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
         @Override
         public boolean onPreDraw() {
             int lineCount = fContentTv.getLineCount();
             Log.i(TAG, "onPreDraw: "+ lineCount);
             if(lineCount>3&&fShowAllTv.getText().equals("全文")){
                 fContentTv.setLines(3);
                 fShowAllTv.setVisibility(View.VISIBLE);
             }
             return true;
         }
     }
);

fShowAllTv.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        if (fShowAllTv.getText().equals("全文")){
            fContentTv.setText(content);
            fContentTv.setEllipsize(null);
            fShowAllTv.setText("收起");
            fContentTv.setSingleLine(false);
        }else{
            fContentTv.setLines(3);
            fContentTv.setEllipsize(TextUtils.TruncateAt.END);
            fShowAllTv.setText("全文");
        }
    }
});
    

来个效果图:

Written on 2016-03-09
上篇: HttpURLConnection使用总结
下篇: GitHub Pages更新Markdown的解释器及语法高亮库