概述 我们在使用手机QQ时,点击菜单键,会弹出如本案例说演示的效果图似的菜单选项。 ? 实现方式有很多种,在这里我们来演示下如何通过自定义PopupWindow的方式一步一步的实现如上效果。...代码中的注释已经非常详细了,再此就不多涉及了。...// 设置Item中的值 viewHolder.textView.setText(datas.get(position).getText() ); return convertView...; } /** * 对应Item布局中的组件 */ class ViewHolder { private TextView textView...中。
RecyclerView 条目的数据 , 因此需要 将条目布局设置为 DataBinding 布局 ; 创建 item.xml 布局后 , 将光标放置在第一个字符位置 , 按下 Alt + 回车 , 弹出如下下拉菜单...数据绑定类实例对象 , 在构造函数中设置改 ItemBinding 对象 ; class MyViewHolder: RecyclerView.ViewHolder { /**...onCreateViewHolder 函数中 , 获取 DataBinding 布局 , 并将其设置给 自定义的 RecyclerView.ViewHolder 对象 ; 获取 DataBinding...布局 : 调用 DataBindingUtil.inflate 函数 , 获取 item.xml 对应的 DataBinding 布局文件类 ItemBinding 实例对象 ; 将 DataBinding...布局设置给自定义 RecyclerView.ViewHolder 实例 : 将上面创建的 ItemBinding 对象通过 构造函数设置到 MyViewHolder 中 ; override
,并且在绘制的时候会从集合中遍历所有的分割线绘制。...4.5、固定位置在实际需求中,交互可能要求我们第一个菜单不可以变更顺序,只能固定,比如效果中的第一个菜单「推荐」固定在首位这种情况。...4.5.1、修改adapter定义一个固定值,并设置不同的背景色和其他菜单区分开。...>() { val fixedPosition = 0 // 固定菜单 override fun onBindViewHolder(holder: ViewHolder, position:...因为我们现在的交互是长按进入编辑,那就需要在长按事件中再调用startDrag手动开启 mAdapter.setOnItemClickListener(object : DragAdapter.OnItemClickListener
,并且在绘制的时候会从集合中遍历所有的分割线绘制。...} 4.5、固定位置 在实际需求中,交互可能要求我们第一个菜单不可以变更顺序,只能固定,比如效果中的第一个菜单「推荐」固定在首位这种情况。...4.5.1、修改adapter 定义一个固定值,并设置不同的背景色和其他菜单区分开。...>() { val fixedPosition = 0 // 固定菜单 override fun onBindViewHolder(holder: ViewHolder, position...因为我们现在的交互是长按进入编辑,那就需要在长按事件中再调用startDrag手动开启 mAdapter.setOnItemClickListener(object : DragAdapter.OnItemClickListener
如果执行了RecyclerView动画的话,尝试根据position从mChangedScrap集合中寻找一个ViewHolder 2....尝试根据position从scrap集合、hide的view集合、mCacheViews(一级缓存)中寻找一个ViewHolder 3....根据position和viewType尝试从用户自定义的mViewCacheExtension中获取一个ViewHolder 7....根据ViewType尝试从RecyclerViewPool中获取一个ViewHolder 8. 调用mAdapter.createViewHolder()来创建一个ViewHolder 9....我们上面已经列出了这个方法的逻辑,其实在前面的第二步: 尝试根据position从scrap集合、hide的view集合、mCacheViews(一级缓存)中寻找一个ViewHolder 即从mAttachedScrap
);//创建ViewHolder对象 convertView.setTag(viewHolder);//convertView关联ViewHolder对象 }else...{ viewHolder=(ViewHolder) convertView.getTag();//convertView关联ViewHolder对象...3、日志添加成功,弹出“保存成功”提示信息,可以看到记录的内容和时间。 4、我们再添加几条日志。 5、长按第一条日志,弹出“是否删除此记录”,然后点击【确定】。...6、这条记录被删除,并且弹出“删除成功”的提示信息。 7、选中并打开第一条记录,将内容修改为【我爱Android】,然后点击保存按钮,发现数据更新,并弹出修改成功的提示信息。...五、项目总结 本次博客主要讲解了如何实现记事本应用,在实现本项目的过程中,熟悉了ListView的使用、数据库的相关操作、Activity的跳转以及数据回传。
ViewHolder> mCachedViews = new ArrayListViewHolder>();//缓存池对象,多个RecyclerView可以指定使用一个pool对象private RecycledViewPool...mRecyclerPool;//自定义的缓存机制对象,用户可以继承之实现自己的一个缓存对象,在指定时机会使用该对象里的缓存对象private ViewCacheExtension mViewCacheExtension...= null) { //此时如果有自定义的cache会尝试从中复用 // We are NOT sending the offsetPosition because...里获取指定type的缓存对象public ViewHolder getRecycledView(int viewType) { final ArrayListViewHolder> scrapHeap...= true; } }...} //4.根据type放入到指定type的缓存集合中public void putRecycledView(ViewHolder scrap) {
回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法。...GridLayoutManager:在网格中展示条目,相当于之前学习的GridView。 StaggeredGridLayoutManager: 在错落的网格中展示条目,比如常见的瀑布流。...依次选择菜单栏File -> Projectrt Structure...,如下图所示: ?...在弹出的窗口中输入recyclerview,然后点击右侧的搜索按钮,即可检索到最新的recyclerview依赖库,最后点击OK按钮即可添加。 ?...需要注意的是,在网格布局中也可以设置列表的Orientation属性,来实现横向和纵向的网格布局。
xxxMNDestroyHandler 中,并在第二次调用期间销毁目标弹出菜单对象;当执行流回到第一次调用的函数中时,目标弹出菜单对象已被销毁,但函数将在缺少必要的验证的情况下直接对目标弹出菜单对象的成员域进行访问甚至执行重复释放的操作...,系统根据当前弹出菜单对象的成员标志位 fIsTrackPopup 选择调用 xxxDestroyWindow 以尝试销毁当前的菜单窗口对象。...因此可以尝试利用这种情况,在调用之前使用来利用的目标弹出菜单对象的成员标志位 fDestroyed 保持未置位的状态,并且未置位 fDestroyed 标志位的目标弹出菜单对象仍需存在于通过 ppmDelayedFree...中调用 xxxMNDestroyHandler 函数处理弹出菜单对象销毁的任务。...接下来在内核中当执行流从创建子菜单窗口对象的函数 xxxCreateWIndowEx 返回到 xxxMNOpenHierarchy 函数中时,函数将照常执行子菜单和根菜单相关对象的关联操作。
一、问题 从下面堆栈中可以看出,RecyclerView此时正在执行布局,尝试获取ViewHolder缓存时发生了crash。...添加前会执行ChildHelper的detachViewForParent方法,设置View的parent对象为null,但不会从RecyclerView中remove;另外,还会对mScrapContainer...于是线索一纠正为:从mAttachedScrap中取到的ViewHolder类型与Adapter取到的不一致。...①② 通过position可以从mAttachedScrap正确获取到原来的ViewHolder并直接复用 ③ 通过position取到了Footer的ViewHolder,发现类型不同,把它从布局中...Footer的ViewHolder添加到了RecycledViewPool,处理完Empty后,会尝试从RecycledViewPool查找,而这里是通过viewType来查找的,所以可以找到上一步添加进来的
开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO。...下面的菜单弹出效果在很多的新闻阅读器上都有,比如今日头条、360新闻等。下 ?...下面看看代码的思路: 由于整体是一个LISTVIEW,所以我把点击的事件写到了对应的Adapter适配器中。...final int position, View convertView, ViewGroup parent) { View vi = convertView; final ViewHolder... popupWindow.dismiss(); } }); } /** * 每个ITEM中more
mContext; private List mFruitList; //实例化子项布局各个view对象 static class ViewHolder extends...(view);//将子项作为参数传给ViewHolder,在ViewHolder里面 } //set对应子项对象 @Override public void onBindViewHolder...(ViewHolder holder, int position) { Fruit fruit = mFruitList.get(position);//get对应子项对象...id; 最后调用into()方法将图片设置到具体某一个ImageView中即可。...,数组存放多个Fruit的实例,每个实例代表一种水果; 在initFruits()方法中,先清空fruitList中的数据,再使用一个随机函数,从刚才定义的Fruit数组中随机挑选一个水果放入到fruitList
系统从当前线程的线程信息对象中获取 pMenuState 成员域指向的菜单状态结构体对象。...xxxDestroyWindow 函数以尝试销毁弹出的子菜单的窗口对象。...需要注意的是,这里尝试销毁的是弹出的子菜单的窗口对象,而不是当前菜单的窗口对象。...执行流从函数 xxxMNCloseHierarchy 返回到函数 xxxMNCancel 中,系统根据当前弹出菜单对象的成员标志位 fIsTrackPopup 选择调用 xxxDestroyWindow...以尝试销毁当前的菜单窗口对象。
一个是从里往外撑,一个是从外往里撑 ScrollView ScrollView滚动视图是指当拥有很多内容,屏幕显示不完时,需要通过滚动跳来显示的视图。ScrollView只支持垂直滚动。...Person p = new Person(name, phone, money); //把person对象保存至集合中 people.add(p); 把集合中的数据显示至屏幕...对象,作为ListView的条目 //position:本次getView方法调用所返回的View对象,在listView中是处于第几个条目,那么position的值就是多少 @Override...当 convertView为时候, 创建一个 ViewHolder对象, 并将控件的实例都存放在 ViewHolder里, 然后调用View的setTag()方法,将 ViewHolder对象存储在 View...); v.setTag(viewHolder); // 将ViewHolder存储在View中 } else { v = convertView; viewHolder = (ViewHolder
如果你是在一个adapter的上下文中调用这个方法,你可能想要调用的是getBindingAdapterPosition()方法。...可能你没有想到这个界面会是一个RecyclerView,但是它确实就是如此,界面中的内容主要分成了如上图所示的3部分。 那么一个RecyclerView中怎么能显示3种完全不同的内容呢?...从名字上就可以看出来了,一个是用于获取元素位于当前绑定Adapter的位置,一个是用于获取元素位于Adapter中的绝对位置。 如果觉得我上面的解释还不够清楚,通过下面的示例看一下你立马就能明白了。...getBindingAdapterPosition()方法,并通过Toast弹出当前点击元素的位置。...由于这是我第一次尝试编写编程语言类型的内容,本来心里不是特别有底,但是看到第一批读者普遍反馈好评之后,我现在更加坚信这本书的质量了。
比如,如果你点击了一个未被选择的item,将发生以下事情: 被点击的item从未被选中的item列表中移除并被添加到包含了两个列表的容器中。 选中的item的位置是固定的。...选中列表按照被选择的先后顺序排列) 一个隐藏的item被添加到选中列表中。 对被点击的item执行过渡动画。 删除被点击的item并显示选中列表中隐藏的item。...这个过程中最技巧性的部分是把view从layout manager移除;否则layout manager 会尝试回收它,因为已经从RecyclerView删除了这个view,所以这会导致错误: sourceRecycler.layoutManager.removeViewAt...通常你需要把一个view从其父亲那里移除并挂载到新的view上。 ...一样的意思只是如果对象是null而被调用的话不会抛出NullPointerException,而是返回null: var targetView: View?
前言 我刚来这个公司的时候,每个周三都会有分享会,主题自定,分享对象尽量是面向大众,一开始觉得不错,但是到后面发现分享的内容不是那么有营养,而且积极性不是很高,都是当做任务进行分享。...从名字就可以看出 「底部导航view」,主要的作用在于给每个模块一个导航定位的功能。 先看一下效果: ?...,end从右侧划出。...上面的属性完全可以像第四种情况叠加使用,至于效果自己尝试了了才能感觉到它的奥妙之处。 8、转场动画 交互有了,现在看是添加点击跳转效果了。...咱们之前跳转动画都是在startActivity之后调用overridePendingTransition方法,传入进入和退出的动画实现跳转动画。
RecyclerView.Adapter.notifyItemMoved(int fromPosition, int toPosition) 函数原型 : 该函数定义在 RecyclerView 的内部类 Adapter 中..., RecyclerView 会尝试去 为适配器 同步可见的结构性改变事件 ; 这样有助于动画和可视化对象的持续 , 但是单独的 item 元素组件需要重新被绑定 ; 代码示例 : 先移动数据 , 再删除三个数据..., 通知数据发生了改变 , RecyclerView 会尝试去 为适配器 同步可见的结构性改变事件 ; * 这样有助于动画和可视化对象的持续 , 但是单独的 item 元素组件需要重新被绑定...从布局中获取 RecyclerView RecyclerView recycler_view = findViewById(R.id.recycler_view); /...extends RecyclerView.ViewHolder { TextView text; public ViewHolder(@NonNull
你看过 Android 中的下拉菜单吗?在 Android 中,这些叫做 Spinner,你猜怎么着?...要填充下拉菜单中的每项,我们为其关联了一个适配器,菜单中的每项都来自数据来源中的某项,可以看出,当你构建 Android 应用时,就会遇到适配器模式。...> parent, View view, int position, long id) 单击此AdapterView中的项时要调用的回调方法。...当convertView为null的时候,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag方法,将ViewHolder对象存储在View中,...当convertView不为null时,调用View的getTag方法,把ViewHolder对象重新取出。
mAttachedScrap:只保存重新布局时从RecyclerView分离的item的无效、未移除、未更新的holder。...把屏幕上的ViewHolder与屏幕分离下来,存放到Scrap中,即发生改变的ViewHolder缓存到mChangedScrap中,不发生改变的ViewHolder存放到mAttachedScrap中...如果mRecyclerPool也没有返回ViewHolder才会调用createViewHolder()重新去创建一个。...因为直接在onBindViewHolder方法中创建匿名内部类的方式来实现setOnItemClick,会导致在RecyclerView快速滑动时创建很多对象。...最后 以上就是RecyclerView性能优化的全部内容,俗话说:百闻不如一见,百见不如一干,大家还是赶紧动手尝试着开始进行优化吧!
领取专属 10元无门槛券
手把手带您无忧上云