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

相关文章

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作