viewholder

Android studio3.5 SDK29项目开发笔记

前提是你 提交于 2019-12-31 21:06:26
1.build.gradle compile过时 改为implementation 2.getDrawable过时 改为 3.Error:Your project path contains non-ASCII characters. 错误原因:引用项目的路径中包含中文 解决1:换英文路径 解决2:项目中的gradle.properties中添加 android.build.gradle.overridePathCheck=true, 重新编译。 4.INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。 5.菜单项onCreateOptionsMenu()和onOptionsItemSelected()的区别: (1)函数onCreateOptionsMenu()为创建Menu菜单的项目。 (2)函数onOptionsItemSelected()为处理菜单被选中运行后的事件处理。 (3)onPrepareOptionsMenu   onPrepareOptionsMenu是每次在display menu之前,都会去呼叫,   只要按一次menu按键,就会呼叫一次。   所以你会发现每次只要按一次menu按键,   menu菜单就会多两个

RecyclerView性能优化及高级使用

你说的曾经没有我的故事 提交于 2019-12-23 09:12:04
最近研究应用流畅度专题时,发现RecyclerView里边的坑真多,有很多可以优化的点,在理解优化点之前,最好对RecyclerView的缓存机制有一些了解,比如得知道CacheView和RecycledViewPool的区别和联系,RecyclerView的绘制流程有一定了解,再来谈RecyclerView的性能提升。缓存机制可以看看这篇文章:基于滑动场景解析RecyclerView的回收复用机制原理 还有一篇外国人写的,ViewHolder的探究,这篇文章把RecyclerView的各级缓存作用剖析得很清晰,以前看过很多人写的文章,感觉都是一知半解,总结下: 1、RecyclerView缓存 1.1 RecyclerView主要有三级缓存: (1)Attached scrap & Changed scrap ArrayList<ViewHolder> mAttachedScrap 主要用在插入或是删除itemView时,先把屏幕内的ViewHolder保存至AttachedScrap中,作用在LayoutManager中,它仅仅把需要从ViewGroup中移除的子view设置它的父view为null,从而实现了从RecyclerView中移除操作detachView()。需要新插入的view从cacheView/Pool中找,没找到则createViewHolder

浅谈Android RecyclerView

感情迁移 提交于 2019-12-19 11:51:30
Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用。 个人体验来说,RecyclerView绝对是一款功能强大的控件。 首先总结下RecyclerView的特点: 1.支持不同方向,不同排版模式,实现多种展现数据的形式,涵盖了ListView,GridView,瀑布流等数据表现的形式 2.内部实现了回收机制,无需我们考虑View的复用情况 3.取消了onItemClick等点击事件,需要自己手动去写 ------------------------------------------------------------------------------------ 那么让我们通过一些Demo来了解RecyclerView的基本使用 首先,要导入support-v7 包 import android.support.v7.widget.RecyclerView; RecyclerView和ListView的使用一样,都需要有对应的Adapter,列表项布局,数据源 1.先写主Activity布局 可以看到RecyclerView的标签 <android.support.v7.widget.RecyclerView> <LinearLayout xmlns:android="http://schemas.android.com

RecyclerView

时光毁灭记忆、已成空白 提交于 2019-12-19 07:26:10
关于布局 1.添加依赖 2.添加<android.support.v7.widget.RecyclerView></android.support.v7.widget.RecyclerView> 关于Activity 1.初始化RecyclerView 2.创建RecyclerView适配器 1)继承RecyclerView.Adapter<MyViewHolder>泛型为自定义内部类ViewHolder 2)创建内部类ViewHolder 继承于RecyclerView.ViewHolder 在这里自定义布局加载控件 class MyViewHolder extends RecyclerView.ViewHolder{ public final TextView tv; public MyViewHolder(View itemView) { super(itemView); tv = (TextView)itemView.findViewById(R.id.tv); } 3)构造方法中存入数据与上下文对象 4)重写三个方法 ①创建RecyclerView的布局并返回viewHolder LayoutInflater mLayoutInflater=LayoutInflater.from(mContent); View inflate = mLayoutInflater

RecyclerView的简单使用

微笑、不失礼 提交于 2019-12-18 14:08:26
在布局文件中声明 在Activity中使用 Adapter的创建 添加单击事件 Item动画 更新数据 1、 在布局文件中声明 <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> 2、 在Activity中使用 // 1,找到这个ViewmRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view); // 2,设置布局管理LayoutManager mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); // 3,(可选)如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 mRecyclerView.setHasFixedSize(true); // 4,设置Adapter mRecyclerView.setAdapter(new MyAdapter());

Android BaseAdapter的使用

一世执手 提交于 2019-12-18 13:23:08
数据适配器有很多种,今天在这里记录一下最通用是适配器BaseAdapter。 首先说一下什么是适配器,这里我从网上找到一幅图片 由上图我们不难看出,所谓的适配器,就是数据与视图之间的桥梁。由它把数据绑定到ListView控件上。 具体怎么绑定呢,今天就来记录一下。首先我们先看一下效果图。 这是我写的一个简单的图片、标题、内容布局。关于ListView 我还想说明一点,就是它的缓存机制。它把所有当前页面不显示的内容都放到缓存里,当页面往上滑动时,超出屏幕的部分也会放到缓存里,新显示的部分会直接从缓存里面取。 1、首先新建一个Android.XML文件,用来显示ListView每一行将要显示样式。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/item_img" android:layout_width="60dp" android:layout_height="60dp" android:layout

android viewHolder处理listView滑动

风流意气都作罢 提交于 2019-12-15 17:44:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在没有用viewHolder的情况下,listView表现效率低下。如果加载的数量过多则会一点点的消耗内存,直到抛出oom。开始异步加载图片会出现图片错位的问题,后来查阅资料将holder里边的图片地址和图片一一对应起来,在异步加载的回调函数中将其替换回来。 holder.thumb_image.setTag(hotel.getHotelTitlePic()); //避免图标错位,在异步加载成功后替换回来 ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl); if(imageView != null){ imageView.setImageDrawable(imageDrawable); imageView.setTag(""); } 以上关键代码解决图片错位问题。 下面是getView()方法 public View getView(int position, View rowView, ViewGroup parent){ final MHotelInfo hotel = this.getItem(position); if (rowView == null) { holder = new ViewHolder();

ViewHolder 为什么加上static修饰

老子叫甜甜 提交于 2019-12-15 17:38:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 静态内部类主要作用就是,内部类是否需要隔离“外部类的this对象(指针)”。内部类是有 this 指针的,可以“直接”访问外部类的 成员变量和成员函数(包括私有的成员)。而静态内部类,没有这个this指针,所以无法“直接”调用。 ViewHolder的构造和复用,与静不静态没关。核心是ListView(AdapterView),通过getView(int position, View convertView, ViewGroup parent) 的convertView会为开发者传入一个可以复用的对象。开发者需要利用该对象,减少应用内存的消耗。 而用static的真正目的其实是 从减少内存消耗的角度来看。ViewHolder还是应该修饰成static比较好。这样ViewHolder中可以减少Activity的this指针,由于减少了一个this指针的引用,也会对Activity的引用计数大大减少。Activity的this指针继承于android的Context上下文,对于Context的回收遗漏,是Android内存管理中很大的问题。我们减少了对Context的引用,可以更容易减少Context引用计数出现问题。 而这个解释来自于 《Effective Java》第22条 优先考虑静态成员类 其中有条建议:

Android示例应用:开源框架Glide的使用

浪子不回头ぞ 提交于 2019-12-13 08:51:35
Android开源框架Glide的使用-示例应用 加载网络图片 加载网络图片 加载本地图片-简易图库 加载网络图片 引入对应的库 compile 'com.android.support:recyclerview-v7:25.0.0' compile 'com.github.bumptech.glide:glide:3.7.0' 创建 RecyclerView 的布局 res/layout/fragment_list.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler_view"></android.support.v7.widget.RecyclerView> 创建 RecyclerView 的每个item的布局 res/layout/list_item.xml 需要注意不要都写成 match_parent 或 wrap_content

安卓开发手把手教你打造万能适配器,告别繁重重复代码

假如想象 提交于 2019-12-10 17:47:38
大家在安卓开发过程中,经常会用到listview或者gridview,在编写代码的时候为了节约资源我们通常会采用持有者模式,即ViewHolder,如果一个工程中有多个listview,通常情况下我会写多个ViewHolder,还有多个adapter,每个adapter都要重写一遍里面的抽象方法,今天就教大家如何避免如此繁重的工作,能够一劳永逸。 首先我们先看一下传统适配器的写法。比如下面这段: package com.jy.myadapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.List; /** * User: juyao(1149950714@qq.com) * Date: 2015-12-12 * Time: 15:03 */ public class OriginAdapter extends BaseAdapter{ private List<Bean> list; private