android回收动画,Android动画回收视图

我创建了一个带有“事件”列表的recyclerview.这适用于低于5的事件列表.但是当我在列表中获得6个或更多事件时,最后一个事件在点击时不会扩展,而是消失.结束动画也停止使用列表中的6个以上事件.

它应该如何表现:

>用户点击事件>视图扩展到全屏

>用户点击展开的事件>视图折叠回原始大小

>用户在展开另一个事件时点击事件>展开事件设置为原始高度.已点击事件扩展为全屏

目前的行为:

>用户点击事件>除了列表中的最后一项外,所有视图都可以正确扩展

>用户点击扩展事件>查看折叠但不动画

>用户在展开另一个事件时点击事件>展开的事件折叠和tapped事件正确扩展

>用户点击列表中的最后一个事件>事件消失(可能会将其大小减小到0以下)

我知道这可能与recyclelerview在屏幕外时重用其视图的方式有关.为了解决这个问题,我通过eventId检查tapped事件的位置,而不是列表中的位置,但这仍然留下了我上面谈到的问题.

public class EventRecyclerAdapter extends RecyclerView.Adapter {

private Context c;

private List items = new ArrayList<>();

private RelativeLayout container;

private int screenheight;

private EventListFragment eventListFragment;

private int expandedPosition = -1;

private static final String TAG = "EventRecyclerAdapter";

public interface ItemClickedListener {

void itemClicked(int position);

}

private ItemClickedListener itemClickedListener;

public EventRecyclerAdapter(List itemlist, Context c, EventListFragment eventListFragment, ItemClickedListener listener) {

this.items = itemlist;

this.c = c;

this.eventListFragment = eventListFragment;

this.itemClickedListener = listener;

}

@Override

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

// create a new view

View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null);

WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);

Display display = wm.getDefaultDisplay();

Point size = new Point();

display.getSize(size);

screenheight = size.y;

// Get the screen height from the device

Resources r = c.getResources();

float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80, r.getDisplayMetrics());

screenheight -= px;

ViewHolder viewHolder = new ViewHolder(itemLayoutView);

return viewHolder;

}

// Replace the contents of a view (invoked by the layout manager)

@Override

public void onBindViewHolder(ViewHolder viewHolder, int position) {

Event event = items.get(position);

// - get data from your itemsData at this position

// - replace the contents of the view with that itemsData

viewHolder.tvName.setText(event.getName());

viewHolder.tvLocation.setText(event.getLocation().getName());

viewHolder.tvDate.setText(Helper.dateDoubleToString(event.getStartDate()));

viewHolder.tvTicketCount.setText(String.valueOf(event.getNumberOfTickets()));

viewHolder.background.setBackgroundColor(Color.GRAY);

viewHolder.eventId = event.getId();

// Load the background image

if (event.getEventImageId() != null) {

Picasso.with(c).load(Helper.imageUrlString(event.getEventImageId())).into(viewHolder.background);

ColorMatrix matrix = new ColorMatrix();

matrix.setSaturation(0);

ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);

viewHolder.background.setColorFilter(filter);

}

// Check if the view needs to be expanded, collapsed or just drawn normally.

if (expandedPosition == event.getId()) {

if (event.expanded) {

collapseView(viewHolder, event);

} else if (!event.expanded) {

expandView(viewHolder, position, event);

}

} else {

setContainerHeight(viewHolder, event);

}

}

private void expandView(final EventRecyclerAdapter.ViewHolder viewHolder, final int pos, Event event) {

ResizeAnimation resizeAnimation = new ResizeAnimation(

viewHolder.container,

viewHolder.container.getHeight(),

screenheight

);

resizeAnimation.setDuration(Constants.ANIMATION_SPEED);

resizeAnimation.setAnimationListener(new Animation.AnimationListener() {

@Override

public void onAnimationStart(Animation animation) {

}

@Override

public void onAnimationEnd(Animation animation) {

viewHolder.infoContainer.setVisibility(View.VISIBLE);

viewHolder.closeIcon.setVisibility(View.VISIBLE);

itemClickedListener.itemClicked(pos);

}

@Override

public void onAnimationRepeat(Animation animation) {

}

});

viewHolder.itemView.startAnimation(resizeAnimation);

viewHolder.expanded = true;

event.expanded = true;

}

private void collapseView(final EventRecyclerAdapter.ViewHolder viewHolder, Event event) {

ResizeAnimation resizeAnimation = new ResizeAnimation(

viewHolder.container,

viewHolder.container.getHeight(),

getContainerCollapsedHeight()

);

resizeAnimation.setDuration(Constants.ANIMATION_SPEED);

viewHolder.infoContainer.setVisibility(View.INVISIBLE);

viewHolder.closeIcon.setVisibility(View.INVISIBLE);

viewHolder.itemView.startAnimation(resizeAnimation);

viewHolder.expanded = false;

event.expanded = false;

}

private void setContainerHeight(EventRecyclerAdapter.ViewHolder viewHolder, Event event) {

viewHolder.container.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getContainerCollapsedHeight()));

viewHolder.infoContainer.setVisibility(View.INVISIBLE);

viewHolder.closeIcon.setVisibility(View.INVISIBLE);

event.expanded = false;

viewHolder.expanded = false;

}

private int getContainerCollapsedHeight() {

int containerHeight;

// Define the item containers height

if (items.size() <= 3) {

containerHeight = screenheight / items.size();

} else {

containerHeight = screenheight / 3;

}

return containerHeight;

}

/**

* Clear all current data and swap add the new data list.

* The expanded position also gets reset

* @param events

*/

public void swap(List events) {

this.items.clear();

this.items.addAll(events);

this.expandedPosition = -1;

Log.v(TAG,"SWAP SIZE : " + items.size());

notifyDataSetChanged();

}

// inner class to hold a reference to each item of RecyclerView

class ViewHolder extends RecyclerView.ViewHolder {

public TextView tvLocation, tvDate, tvTicketCount;

public TextView tvName;

public ImageView background;

public View container;

public View infoContainer;

public TextView closeIcon;

public int eventId;

public boolean expanded = false;

public ViewHolder(final View itemLayoutView) {

super(itemLayoutView);

tvName = (TextView) itemLayoutView.findViewById(R.id.tvName);

tvLocation = (TextView) itemLayoutView.findViewById(R.id.tvLocation);

tvDate = (TextView) itemLayoutView.findViewById(R.id.tvDate);

background = (ImageView) itemLayoutView.findViewById(R.id.background);

tvTicketCount = (TextView) itemLayoutView.findViewById(R.id.ticket_count);

container = itemLayoutView.findViewById(R.id.list_item_container);

infoContainer = itemLayoutView.findViewById(R.id.info_container);

closeIcon = (TextView) itemLayoutView.findViewById(R.id.close_icon);

infoContainer.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Activity mainActivity = (Activity) c;

FragmentManager fm = mainActivity.getFragmentManager();

//add

FragmentTransaction ft = fm.beginTransaction();

ft.setCustomAnimations(R.animator.slide_to_top, R.animator.slide_from_bottom);

ft.addToBackStack(ft.toString());

ft.add(R.id.content_frame, EventFragment.newInstance(items.get(getAdapterPosition())), Constants.EVENT_FRAGMENT_TAG);

//commit change

ft.commit();

}

});

container.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

expandedPosition = eventId;

notifyDataSetChanged();

}

});

}

}

// Return the size of your itemsData (invoked by the layout manager)

@Override

public int getItemCount() {

return items.size();

}

}

我认为当我点击列表中的最后一项时,它以某种方式运行collapseView方法,导致其高度低于0.但我无法弄清楚为什么会发生这种情况.

我希望有人能够发现这里的错误.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 Android体系与系统架构 1 1.1 Google生态系统 2 1.2 Android系统架构 2 1.2.1 Linux 3 1.2.2 Dalvik与ART 3 1.2.3 Framework 3 1.2.4 Standard libraries 4 1.2.5 Application 4 1.3 Android App组件架构 4 1.3.1 Android四大组件如何协同工作 5 1.3.2 应用运行上下文对象 5 1.4 Android系统源代码目录与系统目录 6 1.4.1 Android系统源代码目录 6 1.4.2 Android系统目录 8 1.4.3 Android App文件目录 11 第2章 Android开发工具新接触 13 2.1 Android开发IDE介绍 14 2.1.1 Android Studio初体验 14 2.1.2 Android Studio配置 15 2.2 Android Studio高级使用技巧 19 2.2.1 更新SDK 20 2.2.2 Android Studio常用界面 21 2.2.3 导入Android Studio工程 23 2.3 ADB命令使用技巧 24 2.3.1 ADB基础 24 2.3.2 ADB常用命令 25 2.3.3 ADB命令来源 29 2.4 模拟器使用与配置 29 第3章 Android控件架构与自定义控件详解 32 3.1 Android控件架构 33 3.2 View的测量 34 3.3 View的绘制 37 3.4 View Group的测量 38 3.5 View Group的绘制 39 3.6 自定义View 39 3.6.1 对现有控件进行拓展 40 3.6.2 创建复合控件 43 3.6.3 重写View来实现全新的控件 51 3.7 自定义View Group 54 3.8 事件拦截机制分析 59 第4章 List View使用技巧 65 4.1 List View常用优化技巧 66 4.1.1 使用View Holder模式提高效率 66 4.1.2 设置项目间分隔线 68 4.1.3 隐藏List View的滚动条 68 4.1.4 取消List View的Item点击效果 68 4.1.5 设置List View需要显示在第几项 69 4.1.6 动态修改List View 69 4.1.7 遍历List View中的所有Item 71 4.1.8 处理空List View 71 4.1.9 List View滑动监听 72 4.2 List View常用拓展 74 4.2.1 具有弹性的List View 75 4.2.2 自动显示、隐藏布局的ListV iew 76 4.2.3 聊天List View 79 4.2.4 动态改变List View布局 85 第5章 Android Scroll分析 87 5.1 滑动效果是如何产生的 88 5.1.1 Android坐标系 88 5.1.2 视图坐标系 88 5.1.3 触控事件——MotionEvent 89 5.2 实现滑动的七种方法 91 5.2.1 layout方法 92 5.2.2 offset Left And Right()与offset Top And Bottom() 93 5.2.3 Layout Params 93 5.2.4 scroll To与scrollBy 94 5.2.5 Scroller 96 5.2.6 属性动画 98 5.2.7 View Drag Helper 98 第6章 Android绘图机制与处理技巧 106 6.1 屏幕的尺寸信息 107 6.1.1 屏幕参数 107 6.1.2 系统屏幕密度 107 6.1.3 独立像素密度dp 107 6.1.4 单位转换 108 6.22D绘图基础 110 6.3 Android XML绘图 113 6.3.1 Bitmap 113 6.3.2 Shape 113 6.3.3 Layer 115 6.3.4 Selector 116 6.4 Android绘图技巧 117 6.4.1 Canvas 117 6.4.2 Layer图层 121 6.5 Android图像处理之色彩特效处理 122 6.5.1 色彩矩阵分析 122 6.5.2 Android颜色矩阵——ColorMatrix 128 6.5.3 常用图像颜色矩阵处理效果 131 6.5.4 像素点分析 134 6.5.5 常用图像像素点处理效果 135 6.6 Android图像处理之图形特效处理 137 6.6.1 Android变形矩阵——Matrix 137 6.6.2 像素块分析 142 6.7 Android图像处理之画笔特效处理 145 6.7.1 Porter Duff Xfermode 145 6.7.2 Shader 149 6.7.3 Path Effect 153 6.8 View之孪生兄弟——SurfaceView 155 6.8.1 Surface View与View的区别 155 6.8.2 Surface View的使用 156 6.8.3 Surface View实例 159 第7章 Android动画机制与使用技巧 162 7.1 Android View动画框架 163 7.1.1 透明度动画 163 7.1.2 旋转动画 163 7.1.3 位移动画 164 7.1.4 缩放动画 164 7.1.5 动画集合 164 7.2 Android属性动画分析 165 7.2.1 ObjectAnimator 166 7.2.2 PropertyValuesHolder 168 7.2.3 ValueAnimator 168 7.2.4 动画事件的监听 168 7.2.5 Animator Set 169 7.2.6 在XML中使用属性动画 170 7.2.7 View的animate方法 170 7.3 Android布局动画 171 7.4 Interpolators(插值器) 171 7.5 自定义动画 172 7.6 Android 5.X SVG矢量动画机制 175 7.6.1 <path>标签 175 7.6.2 SVG常用指令 176 7.6.3 SVG编辑器 177 7.6.4 Android中使用SVG 177 7.6.5 SVG动画实例 181 7.7 Android动画特效 188 7.7.1 灵动菜单 188 7.7.2 计时器动画 190 7.7.3 下拉展开动画 191 第8章 Activity与Activity调用栈分析 195 8.1 Activity 196 8.1.1 起源 196 8.1.2 Activity形态 196 8.1.3 生命周期 196 8.2 Android任务栈简介 200 8.3 Android Mainifest启动模式 200 8.3.1 standard 201 8.3.2 single Top 201 8.3.3 single Task 201 8.3.4 single Instance 202 8.4 Intent Flag启动模式 203 8.5 清空任务栈 203 8.6 Activity任务栈使用 204 第9章 Android系统信息与安全机制 205 9.1 Android系统信息获取 206 9.1.1 android.os.Build 206 9.1.2 System Property 207 9.1.3 Android系统信息实例 208 9.2 Android Apk应用信息获取之Package Manager 209 9.2.1 Package Manager 210 9.3 Android Apk应用信息获取之Activity Manager 215 9.4 解析Packages.xml获取系统信息 218 9.5 Android安全机制 220 9.5.1 Android安全机制简介 220 9.5.2 Android系统安全隐患 222 9.5.3 Android Apk反编译 223 9.5.4 Android Apk加密 226 第10章 Android性能优化 227 10.1 布局优化 228 10.1.1 Android UI渲染机制 228 10.1.2 避免Overdraw 229 10.1.3 优化布局层级 229 10.1.4 避免嵌套过多无用布局 229 10.1.5 Hierarchy Viewer 234 10.2 内存优化 236 10.2.1 什么是内存 236 10.2.2 获取Android系统内存信息 237 10.2.3 内存回收 238 10.2.4 内存优化实例 238 10.3 Lint工具 240 10.4 使用Android Studio的Memory Monitor工具 240 10.5 使用Trace View工具优化App性能 241 10.5.1 生成Trace View日志的两种方法 241 10.5.2 打开Trace View日志 242 10.5.3 分析Trace View日志 242 10.6 使用MAT工具分析App内存状态 244 10.6.1 生成HPROF文件 244 10.6.2 分析HPROF文件 245 10.7 使用Dumpsys命令分析系统状态 247 第11章 搭建云端服务器 248 11.1 移动后端服务介绍 249 11.2 使用Bmob创建移动后端服务 250 11.2.1 数据服务 251 11.2.2 推送服务 254 第12章 Android 5.X新特性详解 257 12.1 Android 5.X UI设计初步 258 12.1.1 材料的形态模拟 258 12.1.2 更加真实的动画 258 12.1.3 大色块的使用 259 12.2 Material Design主题 260 12.3 Palette 261 12.4 视图与阴影 263 12.5 Tinting和Clipping 265 12.5.1 Tinting(着色) 265 12.5.2 Clipping(裁剪) 267 12.6 列表与卡片 269 12.6.1 Recycler View 269 12.6.2 Card View 275 12.7 Activity过渡动画 276 12.8 Material Design 动画效果 283 12.8.1 Ripple效果 283 12.8.2 Circular Reveal 285 12.8.3 View state changes Animation 288 12.9 Toolbar 293 12.10 Notification 296 12.10.1 基本的Notification 297 12.10.2 折叠式Notification 298 12.10.3 悬挂式Notification 300 12.10.4 显示等级的Notification 301 第13章 Android实例提高 303 13.1 移动迷宫——拼图游戏 304 13.1.1 准备工作 305 13.1.2 初始界面 307 13.1.3 拼图界面 312 13.1.4 效果预览与功能进阶 324 13.2 魔幻矩阵——2048325 13.2.12048概述 325 13.2.22048游戏分析 326 13.2.32048初始化工作 327 13.2.4 小方块设计 328 13.2.5 全局设置 330 13.2.6 游戏面板设计 332 13.2.7 主程序设计 340 13.2.8 功能进阶 341 13.3 实战经验总结 342
1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求 (6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2、android-async-http 项目地址:https://github.com/loopj/android-async-http 文档介绍:http://loopj.com/android-async-http/ (1) 在匿名回调中处理请求结果 (2) 在UI线程外进行http请求 (3) 文件断点上传 (4) 智能重试 (5) 默认gzip压缩 (6) 支持解析成Json格式 (7) 可将Cookies持久化到SharedPreferences 3、Afinal框架 项目地址:https://github.com/yangfuhai/afinal 主要有四大模块: (1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 (2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。 (3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。 (4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。 FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存管理使用lru算法, 没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档), 更好的管理bitmap内存。FinalBitmap可以自定义下载器,用来扩展其他协议显示网络图片,比如ftp等。同时可以自定义bitmap显示器, 在imageview显示图片的时候播放动画等(默认是渐变动画显示)。 4、xUtils框架 项目地址:https://github.com/wyouflf/xUtils 主要有四大模块: (1) 数据库模块:android中的orm框架,一行代码就可以进行增删改查; 支持事务,默认关闭; 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名); 支持绑定外键,保存实体时外键关联实体自动保存或更新; 自动加载外键关联实体,支持延时加载; 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。 (2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定; 新的事件绑定方式,使用混淆工具混淆后仍可正常工作; 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 (3) 网络模块:支持同步,异步方式的请求; 支持大文件上传,上传大文件不会oom; 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。 (4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象; 支持加载网络图片和本地图片; 内存管理使用lru算法,更好的管理bitmap内存; 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等... 5、ThinkAndroid 项目地址:https://github.com/white-cat/ThinkAndroid 主要有以下模块: (1) MVC模块:实现视图与模型的分离。 (2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。 (3) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。 (4) http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。 (5) 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置 (6) 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。 (7) 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。 (8) 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印 (9) 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。 (10) 网络状态检测模块:当网络状态改变时,对其进行检 6、LoonAndroid 项目地址:https://github.com/gdpancheng/LoonAndroid 主要有以下模块: (1) 自动注入框架(只需要继承框架内的application既可) (2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性) (3) 网络请求模块(继承了基本上现在所有的http请求) (4) eventbus(集成一个开源的框架) (5) 验证框架(集成开源框架) (6) json解析(支持解析成集合或者对象) (7) 数据库(不知道是哪位写的 忘记了) (8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) (9) 自动更新模块 (10) 一系列工具类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值