Android仿微信朋友圈全文收起功能示例(附源碼)
在眾多的社交類軟件中,朋友圈是必不可少的,可以與好友、同學(xué)等分享自己的日常和有意思的事情,在開發(fā)社交類App時(shí),朋友圈發(fā)表的內(nèi)容你不可能讓他全部顯示,全部顯示的話用戶體驗(yàn)度會(huì)非常不好,這時(shí)就要用到全文、收縮的功能,朋友如果想要看你發(fā)的動(dòng)態(tài),只要點(diǎn)一下全文就可以查看所有的全部的內(nèi)容了,如果不想看,也沒有必要把這一篇文章全部都滑到底部,才能看下一條內(nèi)容。
下邊將源碼貼出來供大家參考:(代碼不是最簡(jiǎn)便的,但是功能是可以的)
首先寫一個(gè)布局,這個(gè)布局是每個(gè)子項(xiàng)的布局 item_text_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/tv_hend" android:layout_width="40dp" android:layout_height="40dp" android:layout_marginRight="16dp" android:background="@drawable/circle" android:gravity="center" android:text="1" android:textColor="@android:color/white" android:textSize="14sp" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:alpha="0.87" android:text="丁先森" android:textColor="@android:color/black" android:textSize="14sp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="56dp" android:orientation="vertical" android:paddingBottom="8dp"> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:alpha="0.85" android:ellipsize="end" android:text="" android:textColor="@android:color/black" android:textSize="14sp" /> <TextView android:id="@+id/tv_expand_or_collapse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="全文" android:textColor="@color/colorPrimaryDark" android:textSize="14sp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="0.5dp" android:layout_marginLeft="56dp" android:alpha="0.12" android:background="@android:color/black" /> </LinearLayout>
寫一個(gè)Util類,其實(shí)是存放的數(shù)據(jù),也可以讀取數(shù)據(jù)庫(kù),獲取JSON字符串,這里為了實(shí)現(xiàn)功能就是用固定的數(shù)據(jù)
Util.class
package com.example.friendzhanshou; /** * @author DingChao * 2017/2/10 */ public class Util { private static String[] nameArray = new String[]{ "Windows", "Mac", "Linux" }; private static String[] contentArray = new String[]{ "在動(dòng)作類影片中,只要發(fā)生混亂,那么絕對(duì)就有木倉(cāng)戰(zhàn)。現(xiàn)在的技術(shù)越來越發(fā)達(dá),電影或電視中的特效也做的越來越逼真,演員們被木倉(cāng)打中的效果也很形象,我們經(jīng)常能看到被木倉(cāng)打中的傷口血淋林的暴露在大屏幕中,從演員的表演中我們能看到木倉(cāng)擊是很痛的,那么你們有想過被木倉(cāng)打中到底會(huì)有多痛?什么感覺嗎?網(wǎng)站有網(wǎng)友為我們分享被子彈打中的感覺\n" + "1、“老實(shí)說,比我想象中的感覺要輕很多。本來我以為很痛,可是被打中后就像是被棒球擊中的感覺一樣,剛開始的幾秒鐘沒什么知覺,過會(huì)才感到痛\n" + "2、“被子彈打到的感覺就像是一直有人拿針扎你一樣,刺痛刺痛的?!盶n" + "3、“我當(dāng)初大腿被木倉(cāng)擊中,子彈直接從我的大腿中傳過去,連帶著我的肌腱也被擊中,那種感覺我覺得用疼痛兩個(gè)字已經(jīng)不足以形容了\n" + "4、“在我十七歲的時(shí)候,腳被木倉(cāng)擊中,當(dāng)時(shí)我以為是被蜜蜂蟄了,因?yàn)榉路鹇牭搅嗣鄯涞穆曇?,沒過幾秒鐘,腳上就傳來灼熱感,這才知道原來是被木倉(cāng)擊中了。\n" + "5、“我只是聽到的木倉(cāng)聲,卻沒有意識(shí)到自己中木倉(cāng)了。直到血流出來才意識(shí)到。所以,對(duì)我來講,被子彈擊中沒什么感覺。" , "GNOME or KDE desktop\n" + " processor with support for AMD Virtualization™ (AMD-V™)" }; /** * 獲取文本內(nèi)容根據(jù)下標(biāo) * * @param position * @return */ public static String getContent(int position) { return contentArray[position % contentArray.length]; } /** * 獲取名稱根據(jù)下標(biāo) * * @param position * @return */ public static String getName(int position) { return nameArray[position % contentArray.length]; } }
設(shè)置適配器
TextListAdapter.class
package com.example.friendzhanshou; import android.app.Activity; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.Adapter; import android.widget.TextView; /** * @author DingChao * 2017/2/10 */ public class TextListAdapter extends RecyclerView.Adapter<TextListAdapter.TextHolder> { private Activity mContent; private final int MAX_LINE_COUNT = 3; private final int STATE_UNKNOW = -1; private final int STATE_NOT_OVERFLOW = 1;//文本行數(shù)不能超過限定行數(shù) private final int STATE_COLLAPSED = 2;//文本行數(shù)超過限定行數(shù),進(jìn)行折疊 private final int STATE_EXPANDED = 3;//文本超過限定行數(shù),被點(diǎn)擊全文展開 private SparseArray<Integer> mTextStateList; public TextListAdapter(Activity context) { mContent = context; mTextStateList = new SparseArray<>(); } @Override public TextHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new TextHolder(mContent.getLayoutInflater().inflate(R.layout.item_test_list, parent, false)); } @Override public void onBindViewHolder(final TextHolder holder,final int position) { holder.hend.setText(position+1+"");//設(shè)置頭部的文字 holder.name.setText(Util.getName(position));//設(shè)置名稱 int state=mTextStateList.get(position,STATE_UNKNOW); // 如果該itme是第一次初始化,則取獲取文本的行數(shù) if (state==STATE_UNKNOW){ holder.content.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // 這個(gè)回掉會(huì)調(diào)用多次,獲取玩行數(shù)后記得注銷監(jiān)聽 holder.content.getViewTreeObserver().removeOnPreDrawListener(this); // holder.content.getViewTreeObserver().addOnPreDrawListener(null); // 如果內(nèi)容顯示的行數(shù)大于限定顯示行數(shù) if (holder.content.getLineCount()>MAX_LINE_COUNT) { holder.content.setMaxLines(MAX_LINE_COUNT);//設(shè)置最大顯示行數(shù) holder.expandOrCollapse.setVisibility(View.VISIBLE);//讓其顯示全文的文本框狀態(tài)為顯示 holder.expandOrCollapse.setText("全文");//設(shè)置其文字為全文 mTextStateList.put(position, STATE_COLLAPSED); }else{ holder.expandOrCollapse.setVisibility(View.GONE);//顯示全文隱藏 mTextStateList.put(position,STATE_NOT_OVERFLOW);//讓其不能超過限定的行數(shù) } return true; } }); holder.content.setMaxLines(Integer.MAX_VALUE);//設(shè)置文本的最大行數(shù),為整數(shù)的最大數(shù)值 holder.content.setText(Util.getContent(position));//用Util中的getContent方法獲取內(nèi)容 }else{ // 如果之前已經(jīng)初始化過了,則使用保存的狀態(tài),無需在獲取一次 switch (state){ case STATE_NOT_OVERFLOW: holder.expandOrCollapse.setVisibility(View.GONE); break; case STATE_COLLAPSED: holder.content.setMaxLines(MAX_LINE_COUNT); holder.expandOrCollapse.setVisibility(View.VISIBLE); holder.expandOrCollapse.setText("全文"); break; case STATE_EXPANDED: holder.content.setMaxLines(Integer.MAX_VALUE); holder.expandOrCollapse.setVisibility(View.VISIBLE); holder.expandOrCollapse.setText("收起"); break; } holder.content.setText(Util.getContent(position)); } // 設(shè)置顯示和收起的點(diǎn)擊事件 holder.expandOrCollapse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int state=mTextStateList.get(position,STATE_UNKNOW); if (state==STATE_COLLAPSED){ holder.content.setMaxLines(Integer.MAX_VALUE); holder.expandOrCollapse.setText("收起"); mTextStateList.put(position,STATE_EXPANDED); }else if (state==STATE_EXPANDED){ holder.content.setMaxLines(MAX_LINE_COUNT); holder.expandOrCollapse.setText("全文"); mTextStateList.put(position,STATE_COLLAPSED); } } }); } @Override public int getItemCount() { return 15; } public class TextHolder extends RecyclerView.ViewHolder { public TextView hend; public TextView name; public TextView content; public TextView expandOrCollapse; public TextHolder(View itemView) { super(itemView); // 綁定xml布局中的控件 hend = (TextView) itemView.findViewById(R.id.tv_hend); name = (TextView) itemView.findViewById(R.id.tv_name); content = (TextView) itemView.findViewById(R.id.tv_content); expandOrCollapse = (TextView) itemView.findViewById(R.id.tv_expand_or_collapse); } } }
主布局的內(nèi)容:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.friendzhanshou.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_text_list" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> </RelativeLayout>
MainActivity中的代碼也很簡(jiǎn)單,獲取空間,綁定數(shù)據(jù)源:
package com.example.friendzhanshou; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; public class MainActivity extends AppCompatActivity { private RecyclerView mRvTextList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRvTextList= (RecyclerView) findViewById(R.id.rv_text_list); mRvTextList.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); mRvTextList.setAdapter(new TextListAdapter(this)); } }
demo下載地址:friendzhanshou_jb51.rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter使用NetworkImage實(shí)現(xiàn)圖像顯示效果
這篇文章主要為大家介紹了如何在Flutter中使用NetworkImage實(shí)現(xiàn)圖像顯示效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下吧2022-04-04Android實(shí)現(xiàn)加載時(shí)提示“正在加載,請(qǐng)稍后”的方法
在現(xiàn)在的很多應(yīng)用中,當(dāng)在加載的時(shí)候,如果頁(yè)面動(dòng)態(tài)數(shù)據(jù)較多,會(huì)有很長(zhǎng)一段時(shí)間的空白頁(yè)面,如果加上這個(gè)頁(yè)面正在加載的提示,使得應(yīng)用更加人性化。這篇文章就給大家分享了在 Android實(shí)現(xiàn)加載時(shí)提示“正在加載,請(qǐng)稍后”的方法,有需要的朋友們可以參考借鑒。2016-10-10往Android系統(tǒng)中添加服務(wù)的方法教程
最近因?yàn)槠脚_(tái)升級(jí),需要在系統(tǒng)中添加一些服務(wù),所以將整個(gè)過程總結(jié)一下,下面這篇文章主要給大家介紹了往Android系統(tǒng)中添加服務(wù)的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05Android?Bugreport實(shí)現(xiàn)原理深入分析
這篇文章主要介紹了Android?Bugreport實(shí)現(xiàn)原理,Bugreport主要用于分析手機(jī)的狀態(tài),在應(yīng)用開發(fā)中,程序的調(diào)試分析是日常生產(chǎn)中進(jìn)程會(huì)進(jìn)行的工作,Bugreport就是很常用的工具,需要的朋友可以參考下2024-05-05android的ListView點(diǎn)擊item使item展開的做法的實(shí)現(xiàn)代碼
這篇文章主要介紹了android的ListView點(diǎn)擊item使item展開的做法的實(shí)現(xiàn)代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12Android6.0編程實(shí)現(xiàn)雙向通話自動(dòng)錄音功能的方法詳解
這篇文章主要介紹了Android6.0編程實(shí)現(xiàn)雙向通話自動(dòng)錄音功能的方法,結(jié)合實(shí)例形式分析了Android錄音功能的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07Android在ubuntu上過濾多條關(guān)鍵字日志
今天小編就為大家分享一篇關(guān)于Android在ubuntu上過濾多條關(guān)鍵字日志,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04Android Universal ImageLoader 緩存圖片
Universal Image Loader for Android的目的是為了實(shí)現(xiàn)異步的網(wǎng)絡(luò)圖片加載、緩存及顯示,支持多線程異步加載,通過本文給大家介紹Android Universal ImageLoader緩存圖片相關(guān)資料,涉及到imageloader緩存圖片相關(guān)知識(shí),對(duì)imageloader緩存圖片相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)2016-01-01Android 實(shí)現(xiàn)圖片模糊、高斯模糊、毛玻璃效果的三種方法
在前幾天寫過一個(gè)使用glide-transformations的方法實(shí)現(xiàn)高斯模糊的方法,今天偶然間有發(fā)現(xiàn)一個(gè)大神寫的另一個(gè)方法,感覺挺不錯(cuò)的,分享一下2016-12-12