在众多的社交类软件中,朋友圈是必不可少的,可以与好友、同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文、收缩的功能,朋友如果想要看你发的动态,只要点一下全文就可以查看所有的全部的内容了,如果不想看,也没有必要把这一篇文章全部都滑到底部,才能看下一条内容。

下边将源码贴出来供大家参考:(代码不是最简便的,但是功能是可以的)

首先写一个布局,这个布局是每个子项的布局 item_text_list.xml

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">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:orientation="horizontal">

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" />

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" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="56dp"

android:orientation="vertical"

android:paddingBottom="8dp">

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" />

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" />

android:layout_width="match_parent"

android:layout_height="0.5dp"

android:layout_marginLeft="56dp"

android:alpha="0.12"

android:background="@android:color/black" />

写一个Util类,其实是存放的数据,也可以读取数据库,获取JSON字符串,这里为了实现功能就是用固定的数据

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[]{

"在动作类影片中,只要发生混乱,那么绝对就有木仓战。现在的技术越来越发达,电影或电视中的特效也做的越来越逼真,演员们被木仓打中的效果也很形象,我们经常能看到被木仓打中的伤口血淋林的暴露在大屏幕中,从演员的表演中我们能看到木仓击是很痛的,那么你们有想过被木仓打中到底会有多痛?什么感觉吗?网站有网友为我们分享被子弹打中的感觉\n" +

"1、“老实说,比我想象中的感觉要轻很多。本来我以为很痛,可是被打中后就像是被棒球击中的感觉一样,刚开始的几秒钟没什么知觉,过会才感到痛\n" +

"2、“被子弹打到的感觉就像是一直有人拿针扎你一样,刺痛刺痛的。”\n" +

"3、“我当初大腿被木仓击中,子弹直接从我的大腿中传过去,连带着我的肌腱也被击中,那种感觉我觉得用疼痛两个字已经不足以形容了\n" +

"4、“在我十七岁的时候,脚被木仓击中,当时我以为是被蜜蜂蛰了,因为仿佛听到了蜜蜂的声音,没过几秒钟,脚上就传来灼热感,这才知道原来是被木仓击中了。\n" +

"5、“我只是听到的木仓声,却没有意识到自己中木仓了。直到血流出来才意识到。所以,对我来讲,被子弹击中没什么感觉。"

,

"GNOME or KDE desktop\n" +

" processor with support for AMD Virtualization™ (AMD-V™)"

};

/**

* 获取文本内容根据下标

*

* @param position

* @return

*/

public static String getContent(int position) {

return contentArray[position % contentArray.length];

}

/**

* 获取名称根据下标

*

* @param position

* @return

*/

public static String getName(int position) {

return nameArray[position % contentArray.length];

}

}

设置适配器

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 {

private Activity mContent;

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 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+"");//设置头部的文字

holder.name.setText(Util.getName(position));//设置名称

int state=mTextStateList.get(position,STATE_UNKNOW);

// 如果该itme是第一次初始化,则取获取文本的行数

if (state==STATE_UNKNOW){

holder.content.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

@Override

public boolean onPreDraw() {

// 这个回掉会调用多次,获取玩行数后记得注销监听

holder.content.getViewTreeObserver().removeOnPreDrawListener(this);

// holder.content.getViewTreeObserver().addOnPreDrawListener(null);

// 如果内容显示的行数大于限定显示行数

if (holder.content.getLineCount()>MAX_LINE_COUNT) {

holder.content.setMaxLines(MAX_LINE_COUNT);//设置最大显示行数

holder.expandOrCollapse.setVisibility(View.VISIBLE);//让其显示全文的文本框状态为显示

holder.expandOrCollapse.setText("全文");//设置其文字为全文

mTextStateList.put(position, STATE_COLLAPSED);

}else{

holder.expandOrCollapse.setVisibility(View.GONE);//显示全文隐藏

mTextStateList.put(position,STATE_NOT_OVERFLOW);//让其不能超过限定的行数

}

return true;

}

});

holder.content.setMaxLines(Integer.MAX_VALUE);//设置文本的最大行数,为整数的最大数值

holder.content.setText(Util.getContent(position));//用Util中的getContent方法获取内容

}else{

// 如果之前已经初始化过了,则使用保存的状态,无需在获取一次

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));

}

// 设置显示和收起的点击事件

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);

}

}

}

主布局的内容:

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:id="@+id/rv_text_list"

android:layout_width="match_parent"

android:layout_height="match_parent">

MainActivity中的代码也很简单,获取空间,绑定数据源:

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));

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 朋友圈功能,Android仿微信朋友圈全文收起功能示例(附源码)相关推荐

  1. android仿qq折叠,android列表收缩与展开仿QQ好友列表(非常详细,附源码)

    好友QQ列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到android的E ...

  2. Android列表收缩与展开仿QQ好友列表(非常详细,附源码)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同 ...

  3. html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)

    文章目录 1.功能模板 1.1 仿爱奇艺 1.2 仿搜狐视频 1.3 仿迅雷看看 1.4 视频播放 1.5 影视公司官网 2.效果和源码 2.1 源代码 2.2 模板目录 源码下载 作者:xcLeig ...

  4. echarts实现3D地图,轮播功能、背景图片、鼠标悬浮展示数据,附源码!

    echarts实现3D地图,轮播功能.背景图片.鼠标悬浮展示数据,附源码! 一.图片效果 二. 代码 一.图片效果 由于本地图片上传失败,无法展示完整的,不过是在此图的基础上加了轮播和底纹 二. 代码 ...

  5. 分享个微信锁再也不怕别人偷看!附源码

    介绍: 分享个微信锁再也不怕别人偷看!附源码 网盘下载地址: http://kekewl.net/Z2PLSi6gPmb 图片:

  6. Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

    本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击 ...

  7. 一款仿网易云音乐Java开源系统(附源码)

    嗨喽!Java后端编程的各位小伙伴们,由于公众号做了乱序推送改版,为了保证公众号的推文能够第一时间及时送达到大家手上,大家记得将公众号 加星标置顶 ,公众号每天会送上Java技术干货推文 ! 上篇推文 ...

  8. android 文字点击展开,仿微信朋友圈,文字展开全文,全文收起功能

    android:id="@+id/tv_expand_or_fold" android:layout_width="wrap_content" android: ...

  9. android 拖动控件删除,Android学习------拖动删除(仿微信朋友圈拖动删除)

    1 示例 发朋友圈的时候,长按图片可以调整顺序,还可以拖动到底部删除. 2 官方示例: https://developer.android.google.cn/guide/topics/ui/drag ...

  10. 【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)

    需要源码和Jar包请点赞关注收藏后评论区留下QQ~~~ 一.在线语音合成 虽然国产智能机大多集成了中文语音引擎,但是系统自带的语音工具无法满足商用要求,功能单一,所以势必引入第三方的语音引擎,依靠第三 ...

最新文章

  1. nginx重写rewrite的[emerg] unknown directive
  2. java paintComponent的一些解读
  3. Tomcat 怎么停止服务的?
  4. 2021第一季度云智能生态技术服务能力盘点
  5. 【Linux】一步一步学Linux——exec命令(208)
  6. android one x3怎么样,618旗舰手机怎么选,看完这篇文章,你就会知道
  7. 迪米特法则(设计模式5)
  8. 异步方法的编写与使用
  9. Ninject学习(一) - Dependency Injection By Hand
  10. 【Tools】TCP/IP 测试工具——SocketTools
  11. 安装axure插件以便打开原型文件
  12. python有道批量单词音标整理-python调用有道智云API实现文件批量翻译
  13. spark学习之执行计划explain
  14. 金蝶K3案例实验实际成本后台配置
  15. 遇到unhandled exception:怎么处理?
  16. 使用 htop 和 ps 来监控 Linux 运行
  17. Windows系统文件类型大全
  18. mavennexus环境搭建
  19. 【资料下载区】【iCore3相关代码、资料下载地址】更新日期2017/06/28
  20. Stm32嵌入式电子相册简易实现

热门文章

  1. 使用百度api获取经纬度的偏差问题
  2. 【MSP432电机驱动学习—上篇】TB6612带稳压电机驱动模块、MG310电机、霍尔编码器
  3. 分享一个薅羊毛的机会!
  4. 计算机科学导论XOR掩码,计算机科学导论模拟题2.doc
  5. {“errorMessage“:“Process exited unexpectedly before completing request 且UnhandledInvocationError
  6. 微信公众号文章转pdf下载,不难也不太容易,磕磕绊绊倒是不少如何用xpath保存网站源码;如何精简你的文章请求链接;如何将文章转化为pdf文件,不乱码,不报错
  7. 【PA2014】【BZOJ3719】Plemiona
  8. 卡特兰数问题——一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
  9. 全国行政区划代码(json对象)---包含键值对的城市代号和城市名称的json对象代码(包括县级市)
  10. java最新版安装教程_手把手教你安装Eclipse最新版本的详细教程 (非常详细,非常实用)...