仿照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

相关文章

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

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