在众多的社交类软件中,朋友圈是必不可少的,可以与好友、同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文、收缩的功能,朋友如果想要看你发的动态,只要点一下全文就可以查看所有的全部的内容了,如果不想看,也没有必要把这一篇文章全部都滑到底部,才能看下一条内容。
下边将源码贴出来供大家参考:(代码不是最简便的,但是功能是可以的)
首先写一个布局,这个布局是每个子项的布局 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>
写一个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<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;//文本行数不能超过限定行数
private final int STATE_COLLAPSED = 2;//文本行数超过限定行数,进行折叠
private final int STATE_EXPANDED = 3;//文本超过限定行数,被点击全文展开
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+"");//设置头部的文字
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);
}
}
}
主布局的内容:
<?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中的代码也很简单,获取空间,绑定数据源:
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# 全文
# 收起
# Android全文收起
# Android仿微信朋友圈全文、收起功能的实例代码
# 行数
# 也很
# 意识到
# 绑定
# 不能超过
# 让其
# 几秒钟
# 很痛
# 自己的
# 没什么
# 我想
# 这一
# 在我
# 带着
# 对我
# 我觉得
# 让他
# 过了
# 也没
# 就有
相关文章:
Thinkphp 中 distinct 的用法解析
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
建站之星伪静态规则如何设置?
建站之星如何优化SEO以实现高效排名?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何登录建站主机?访问步骤全解析
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
,巨量百应是干嘛的?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何用搬瓦工VPS快速搭建个人网站?
如何用虚拟主机快速搭建网站?详细步骤解析
如何快速搭建个人网站并优化SEO?
如何通过免费商城建站系统源码自定义网站主题与功能?
,在苏州找工作,上哪个网站比较好?
,怎么在广州志愿者网站注册?
一键网站制作软件,义乌购一件代发流程?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
如何快速启动建站代理加盟业务?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
郑州企业网站制作公司,郑州招聘网站有哪些?
深圳网站制作平台,深圳市做网站好的公司有哪些?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
,南京靠谱的征婚网站?
Bpmn 2.0的XML文件怎么画流程图
北京专业网站制作设计师招聘,北京白云观官方网站?
公众号网站制作网页,微信公众号怎么制作?
如何快速搭建高效WAP手机网站吸引移动用户?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
建站之星如何取消后台验证码生成?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何在万网开始建站?分步指南解析
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
如何在西部数码注册域名并快速搭建网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
如何在腾讯云免费申请建站?
免费视频制作网站,更新又快又好的免费电影网站?
建站之星如何修改网站生成路径?
自助网站制作软件,个人如何自助建网站?
如何在阿里云高效完成企业建站全流程?
上海网站制作开发公司,上海买房比较好的网站有哪些?
已有域名和空间如何快速搭建网站?
建站之星客服服务时间及联系方式如何?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
c# await 一个已经完成的Task会发生什么
如何选择高性价比服务器搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。