仿照iphone设置点击更多显示全部内容

2023-12-25 06:38

本文主要是介绍仿照iphone设置点击更多显示全部内容,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ListView里每一条显示版本信息,由于内容过长只显示部分,展开后能显示全部内容,并且再次点击收缩。

自定义View

public class CollapsableTextView extends LinearLayout implementsView.OnClickListener {/** default text show max lines */private static final int DEFAULT_MAX_LINE_COUNT = 3;private static final int COLLAPSIBLE_STATE_NONE = 0;private static final int COLLAPSIBLE_STATE_SHRINKUP = 1;private static final int COLLAPSIBLE_STATE_SPREAD = 2;private TextView mVersionDetail;private TextView mMoreState;private String shrinkup;private String spread;private int mState = COLLAPSIBLE_STATE_SPREAD;private boolean flag;public CollapsableTextView(Context context, AttributeSet attrs) {super(context, attrs);shrinkup = context.getString(R.string.shrinkup);spread = context.getString(R.string.spread);View view = inflate(context, R.layout.preference_list_item, this);view.setPadding(0, -1, 0, 0);mVersionDetail = (TextView) view.findViewById(R.id.detail);mMoreState = (TextView) view.findViewById(R.id.more);mMoreState.setTextColor(context.getResources().getColor(R.color.holo_blue_dark));mMoreState.setOnClickListener(this);}public CollapsableTextView(Context context) {this(context, null);}public void setDesc(CharSequence charSequence, TextView.BufferType bufferType) {mVersionDetail.setText(charSequence, bufferType);mState = COLLAPSIBLE_STATE_SPREAD;requestLayout();}@Overridepublic void onClick(View v) {flag = !flag;requestLayout();}/**** @param view detail* @return state*/private int checkViewState(TextView view) {Layout layout = view.getLayout();if (layout != null) {int lines = layout.getLineCount();if (lines > 0) {if (layout.getEllipsisCount(lines - 1) == 0) {if (view.getLineCount() <= DEFAULT_MAX_LINE_COUNT) {return COLLAPSIBLE_STATE_NONE;} else {return COLLAPSIBLE_STATE_SPREAD;}}}}return COLLAPSIBLE_STATE_SHRINKUP;}public void updateView() {mState = checkViewState(mVersionDetail);mMoreState.setVisibility(mState > 0 ? View.VISIBLE : View.INVISIBLE);if (mState > 0) {mMoreState.setText(mState == COLLAPSIBLE_STATE_SPREAD ? shrinkup : spread);}}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);updateView();Log.i(ConstantUtil.TAG, "onLayout:" + mVersionDetail.getLineCount() + "," + flag + "," +mMoreState.getVisibility() + "," + checkViewState(mVersionDetail));if (!flag) {flag = true;if (checkViewState(mVersionDetail) == COLLAPSIBLE_STATE_NONE) {mVersionDetail.setMaxLines(DEFAULT_MAX_LINE_COUNT);} else {post(new InnerRunnable());}}}class InnerRunnable implements Runnable {@Overridepublic void run() {Log.i(ConstantUtil.TAG, "Runnable :" + mState);if (mState == COLLAPSIBLE_STATE_SPREAD) {mVersionDetail.setMaxLines(DEFAULT_MAX_LINE_COUNT);mMoreState.setText(spread);mState = COLLAPSIBLE_STATE_SHRINKUP;} else if (mState == COLLAPSIBLE_STATE_SHRINKUP) {mVersionDetail.setMaxLines(Integer.MAX_VALUE);mMoreState.setText(shrinkup);mState = COLLAPSIBLE_STATE_SPREAD;}}}}

Activity页面包含Listview,Adapter由于ListView复用的原因,需要重新requestLayout。

public class PreferenceList extends ListActivity implements AdapterView.OnItemClickListener{PreferenceListAdapter mAdapter;JSONArray mVersionList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mVersionList = getData();getListView().setOnItemClickListener(this);getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);mAdapter = new PreferenceListAdapter();setListAdapter(mAdapter);}private JSONArray getData() {JsonHelper helper = new JsonHelper();JSONArray list = null;try {list = helper.getJson(this, ConstantUtil.JSON_FILE_NAME);} catch (JSONException e) {e.printStackTrace();}return list;}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {view.findViewById(R.id.more).performClick();}private class PreferenceListAdapter extends BaseAdapter {private ViewHolder mHolder;PreferenceListAdapter() {}@Overridepublic int getCount() {return mVersionList.length();}@Overridepublic Object getItem(int position) {Object item = null;try {item = mVersionList.getJSONObject(position);} catch (JSONException e) {e.printStackTrace();}return item;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {mHolder = new ViewHolder();convertView = View.inflate(PreferenceList.this, R.layout.preference_item, null);mHolder.version = (TextView) convertView.findViewById(R.id.version);mHolder.date = (TextView) convertView.findViewById(R.id.date);mHolder.detail = (TextView) convertView.findViewById(R.id.detail);convertView.setTag(mHolder);} else {mHolder = (ViewHolder) convertView.getTag();convertView.requestLayout();}Log.i(ConstantUtil.TAG, "getView: " + position);try {mHolder.version.setText(mVersionList.getJSONObject(position).getString("check_version"));mHolder.date.setText(mVersionList.getJSONObject(position).getString("date"));mHolder.detail.setText(mVersionList.getJSONObject(position).getString("version_detail"));} catch (JSONException e) {e.printStackTrace();}return convertView;}}private class ViewHolder {TextView version;TextView date;TextView detail;}}

布局文件比较简单,就看自定义布局

<com.example.zxz.asdemo.data.CollapsableTextViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:orientation="vertical"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"></com.example.zxz.asdemo.data.CollapsableTextView>

android:textAppearance="?android:attr/textAppearanceSmall" 

字体样式




这篇关于仿照iphone设置点击更多显示全部内容的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534560

相关文章

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas