在眾多的社交類軟件中,朋友圈是必不可少的,可以與好友、同學(xué)等分享自己的日常和有意思的事情,在開(kāi)發(fā)社交類App時(shí),朋友圈發(fā)表的內(nèi)容你不可能讓他全部顯示,全部顯示的話用戶體驗(yàn)度會(huì)非常不好,這時(shí)就要用到全文、收縮的功能,朋友如果想要看你發(fā)的動(dòng)態(tài),只要點(diǎn)一下全文就可以查看所有的全部的內(nèi)容了,如果不想看,也沒(méi)有必要把這一篇文章全部都滑到底部,才能看下一條內(nèi)容。

 

源碼地址:鏈接:http://pan.baidu.com/s/1boQC7vT 密碼:qfnk

如果鏈接失效,請(qǐng)發(fā)我郵箱:dingchao7323@qq.com看一下具體的效果圖:

  萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

下邊將源碼貼出來(lái)供大家參考:(代碼不是最簡(jiǎn)便的,但是功能是可以的)

 首先寫一個(gè)布局,這個(gè)布局是每個(gè)子項(xiàng)的布局 item_text_list.xml

 

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="wrap_content" 5     android:orientation="vertical" 6     android:paddingBottom="@dimen/activity_vertical_margin" 7     android:paddingLeft="@dimen/activity_horizontal_margin" 8     android:paddingRight="@dimen/activity_horizontal_margin" 9     android:paddingTop="@dimen/activity_vertical_margin">10 
11     <LinearLayout12         android:layout_width="match_parent"13         android:layout_height="wrap_content"14         android:layout_gravity="center_vertical"15         android:orientation="horizontal">16 
17         <TextView18             android:id="@+id/tv_hend"19             android:layout_width="40dp"20             android:layout_height="40dp"21             android:layout_marginRight="16dp"22             android:background="@drawable/circle"23             android:gravity="center"24             android:text="1"25             android:textColor="@android:color/white"26             android:textSize="14sp" />27 
28         <TextView29             android:id="@+id/tv_name"30             android:layout_width="wrap_content"31             android:layout_height="wrap_content"32             android:alpha="0.87"33             android:text="丁先森"34             android:textColor="@android:color/black"35             android:textSize="14sp" />36     </LinearLayout>37 
38     <LinearLayout39         android:layout_width="match_parent"40         android:layout_height="wrap_content"41         android:layout_marginLeft="56dp"42         android:orientation="vertical"43         android:paddingBottom="8dp">44 
45         <TextView46             android:id="@+id/tv_content"47             android:layout_width="wrap_content"48             android:layout_height="wrap_content"49             android:layout_marginBottom="8dp"50             android:alpha="0.85"51             android:ellipsize="end"52             android:text=""53             android:textColor="@android:color/black"54             android:textSize="14sp" />55 
56         <TextView57             android:id="@+id/tv_expand_or_collapse"58             android:layout_width="wrap_content"59             android:layout_height="wrap_content"60             android:text="全文"61             android:textColor="@color/colorPrimaryDark"62             android:textSize="14sp" />63     </LinearLayout>64 
65     <View66         android:layout_width="match_parent"67         android:layout_height="0.5dp"
68         android:layout_marginLeft="56dp"
69         android:alpha="0.12"
70         android:background="@android:color/black" />
71 </LinearLayout>

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

 

 

 

 

寫一個(gè)Util類,其實(shí)是存放的數(shù)據(jù),也可以讀取數(shù)據(jù)庫(kù),獲取JSON字符串,這里為了實(shí)現(xiàn)功能就是用固定的數(shù)據(jù)

Util.class

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 1 package com.example.friendzhanshou; 2 
 3 /** 4  * @author DingChao 5  *         2017/2/10 6  */ 7 
 8 public class Util { 9     private static String[] nameArray = new String[]{10             "Windows", "Mac", "Linux"11     };12     private static String[] contentArray = new String[]{13             "在動(dòng)作類影片中,只要發(fā)生混亂,那么絕對(duì)就有木倉(cāng)戰(zhàn)?,F(xiàn)在的技術(shù)越來(lái)越發(fā)達(dá),電影或電視中的特效也做的越來(lái)越逼真,演員們被木倉(cāng)打中的效果也很形象,我們經(jīng)常能看到被木倉(cāng)打中的傷口血淋林的暴露在大屏幕中,從演員的表演中我們能看到木倉(cāng)擊是很痛的,那么你們有想過(guò)被木倉(cāng)打中到底會(huì)有多痛?什么感覺(jué)嗎?網(wǎng)站有網(wǎng)友為我們分享被子彈打中的感覺(jué)\n" +14                     "1、“老實(shí)說(shuō),比我想象中的感覺(jué)要輕很多。本來(lái)我以為很痛,可是被打中后就像是被棒球擊中的感覺(jué)一樣,剛開(kāi)始的幾秒鐘沒(méi)什么知覺(jué),過(guò)會(huì)才感到痛\n" +15                     "2、“被子彈打到的感覺(jué)就像是一直有人拿針扎你一樣,刺痛刺痛的?!盶n" +16                     "3、“我當(dāng)初大腿被木倉(cāng)擊中,子彈直接從我的大腿中傳過(guò)去,連帶著我的肌腱也被擊中,那種感覺(jué)我覺(jué)得用疼痛兩個(gè)字已經(jīng)不足以形容了\n" +17                     "4、“在我十七歲的時(shí)候,腳被木倉(cāng)擊中,當(dāng)時(shí)我以為是被蜜蜂蟄了,因?yàn)榉路鹇?tīng)到了蜜蜂的聲音,沒(méi)過(guò)幾秒鐘,腳上就傳來(lái)灼熱感,這才知道原來(lái)是被木倉(cāng)擊中了。\n" +18                     "5、“我只是聽(tīng)到的木倉(cāng)聲,卻沒(méi)有意識(shí)到自己中木倉(cāng)了。直到血流出來(lái)才意識(shí)到。所以,對(duì)我來(lái)講,被子彈擊中沒(méi)什么感覺(jué)。"19           ,20             "GNOME or KDE desktop\n" +21                    " processor with support for AMD Virtualization? (AMD-V?)"22 
23 
24     };25 
26     /**27      * 獲取文本內(nèi)容根據(jù)下標(biāo)28      *29      * @param position30      * @return31      */32 
33     public static String getContent(int position) {34         return contentArray[position % contentArray.length];35     }36 
37     /**38      * 獲取名稱根據(jù)下標(biāo)39      *40      * @param position41      * @return42      */43     public static String getName(int position) {44         return nameArray[position % contentArray.length];45     }46 }

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

 

設(shè)置適配器

TextListAdapter.class

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

  1 package com.example.friendzhanshou;  2 
  3 import android.app.Activity;  4 import android.support.v7.widget.RecyclerView;  5 import android.util.SparseArray;  6 import android.view.View;  7 import android.view.ViewGroup;  8 import android.view.ViewTreeObserver;  9 import android.widget.Adapter; 10 import android.widget.TextView; 11 
 12 /** 13  * @author DingChao 14  *         2017/2/10 15  */ 16 
 17     public class TextListAdapter extends RecyclerView.Adapter<TextListAdapter.TextHolder> { 18     private Activity mContent; 19 
 20     private final int MAX_LINE_COUNT = 3; 21 
 22     private final int STATE_UNKNOW = -1; 23 
 24     private final int STATE_NOT_OVERFLOW = 1;//文本行數(shù)不能超過(guò)限定行數(shù) 25 
 26     private final int STATE_COLLAPSED = 2;//文本行數(shù)超過(guò)限定行數(shù),進(jìn)行折疊 27 
 28     private final int STATE_EXPANDED = 3;//文本超過(guò)限定行數(shù),被點(diǎn)擊全文展開(kāi) 29 
 30     private SparseArray<Integer> mTextStateList; 31 
 32     public TextListAdapter(Activity context) { 33         mContent = context; 34         mTextStateList = new SparseArray<>(); 35     } 36 
 37     @Override 38     public TextHolder onCreateViewHolder(ViewGroup parent, int viewType) { 39         return new TextHolder(mContent.getLayoutInflater().inflate(R.layout.item_test_list, parent, false)); 40     } 41 
 42     @Override 43     public void onBindViewHolder(final TextHolder holder,final int position) { 44         holder.hend.setText(position+1+"");//設(shè)置頭部的文字 45         holder.name.setText(Util.getName(position));//設(shè)置名稱 46         int state=mTextStateList.get(position,STATE_UNKNOW); 47 //        如果該itme是第一次初始化,則取獲取文本的行數(shù) 48         if (state==STATE_UNKNOW){ 49             holder.content.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 50                 @Override 51                 public boolean onPreDraw() { 52 //                    這個(gè)回掉會(huì)調(diào)用多次,獲取玩行數(shù)后記得注銷監(jiān)聽(tīng) 53                     holder.content.getViewTreeObserver().removeOnPreDrawListener(this); 54 //                    holder.content.getViewTreeObserver().addOnPreDrawListener(null); 55 //                    如果內(nèi)容顯示的行數(shù)大于限定顯示行數(shù) 56                     if (holder.content.getLineCount()>MAX_LINE_COUNT) { 57                         holder.content.setMaxLines(MAX_LINE_COUNT);//設(shè)置最大顯示行數(shù) 58                         holder.expandOrCollapse.setVisibility(View.VISIBLE);//讓其顯示全文的文本框狀態(tài)為顯示 59                         holder.expandOrCollapse.setText("全文");//設(shè)置其文字為全文 60                         mTextStateList.put(position, STATE_COLLAPSED); 61                     }else{ 62                         holder.expandOrCollapse.setVisibility(View.GONE);//顯示全文隱藏 63                         mTextStateList.put(position,STATE_NOT_OVERFLOW);//讓其不能超過(guò)限定的行數(shù) 64                     } 65                     return true; 66                 } 67             }); 68 
 69             holder.content.setMaxLines(Integer.MAX_VALUE);//設(shè)置文本的最大行數(shù),為整數(shù)的最大數(shù)值 70             holder.content.setText(Util.getContent(position));//用Util中的getContent方法獲取內(nèi)容 71         }else{
 72 //            如果之前已經(jīng)初始化過(guò)了,則使用保存的狀態(tài),無(wú)需在獲取一次
 73             switch (state){
 74                 case STATE_NOT_OVERFLOW:
 75                     holder.expandOrCollapse.setVisibility(View.GONE);
 76                     break;
 77                 case STATE_COLLAPSED:
 78                     holder.content.setMaxLines(MAX_LINE_COUNT);
 79                     holder.expandOrCollapse.setVisibility(View.VISIBLE);
 80                     holder.expandOrCollapse.setText("全文");
 81                     break;
 82                 case STATE_EXPANDED:
 83                     holder.content.setMaxLines(Integer.MAX_VALUE);
 84                     holder.expandOrCollapse.setVisibility(View.VISIBLE);
 85                     holder.expandOrCollapse.setText("收起");
 86                     break;
 87             }
 88             holder.content.setText(Util.getContent(position));
 89         }
 90 
 91 
 92 //        設(shè)置顯示和收起的點(diǎn)擊事件
 93         holder.expandOrCollapse.setOnClickListener(new View.OnClickListener() {
 94             @Override
 95             public void onClick(View v) {
 96                 int state=mTextStateList.get(position,STATE_UNKNOW);
 97                 if (state==STATE_COLLAPSED){
 98                     holder.content.setMaxLines(Integer.MAX_VALUE);
 99                     holder.expandOrCollapse.setText("收起");
100                     mTextStateList.put(position,STATE_EXPANDED);
101                 }else if (state==STATE_EXPANDED){
102                     holder.content.setMaxLines(MAX_LINE_COUNT);
103                     holder.expandOrCollapse.setText("全文");
104                     mTextStateList.put(position,STATE_COLLAPSED);
105                 }
106             }
107         });
108 
109     }
http://www.cnblogs.com/dingxiansen/p/6387653.html