欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android仿微信朋友圈全文收起功能示例(附源码)

程序员文章站 2023-12-18 21:48:10
在众多的社交类软件中,朋友圈是必不可少的,可以与好友、同学等分享自己的日常和有意思的事情,在开发社交类app时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度...

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

Android仿微信朋友圈全文收起功能示例(附源码)

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

首先写一个布局,这个布局是每个子项的布局 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下载地址:

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

上一篇:

下一篇: