全部 文章 问答 分享 共找到267个相关内容
[文章] RecyclerView把item可以拖拽到任意地方,你没玩过的船新版本01
背景需求是把列表中的内容,拖到某个地方,然后删除。例子:在win桌面中,拖住某个文件夹或者文件,拖到垃圾桶中,松开就把文件丢到垃圾桶去了。
1970-01-01 00:00 · RecycleView / debug / 断点 / 突破三届 / 哈哈 / 含光君
[问答] 喜马拉雅项目历史记录里的记录上次播放到什么地方了呢
我看实例APP每次从历史列表某一个item点进去就是播放上一次播放到的地方而我的从历史列表点进去就是从头开始,不知道哪里有逻辑的缺陷而且album里面字段并没有记录当前播放到哪里的字段,不知道示例APP
2020-05-12 01:03 · 喜马拉雅
[文章] Web开发点赞竟然有这么多值得思考的地方
Web开发点赞竟然有这么多值得思考的地方!基本上每个跟社交有关系的网站,都有点赞。微博,知乎,B站,头条,掘金....可是这个点赞功能如是何实现的呢?你这个点赞的动作,这个世界发生了什么事情呢?
2021-03-26 11:08 · like / 点赞 / 后台 / web开发 / 数据库
[文章] RecyclerView把item可以拖拽到任意地方具体实现
背景之前分享过一个拖拽recycleview的item到列表之外的功能,分析了实现的难点,现在继续分享实现过程。之前的文章清空这里https://www.sunofbeach.net/a/842817116162752512分析功能之前提到过,rv的item只能显示在rv所在的区域中,item的view是不能显示在外面的,这一点已经卡主我们了既然不能,那我们复制一份itemView,然后手指移动的时候把这个复制品跟随手指移动,可行?复制后的view放哪里?我们在根布局可以新增透明的容器来容纳它复制触发之后,把复制的view显示在原来item的位置上,然后把item的内容隐藏,手指移动的时候item就消失了当手指松开的时候,做个动画,item跑回来开始的位置上,隐藏同时把item原来的数据显示出来复制品移动到某个区域中松开的时候,就触发删除,当然可以是任意逻辑,删除了就删除rv中对用的position,更新adapter基本上就是这么做了,当时我把上面的逻辑写在本子上,一个一个实现,最后真的做好了。思路很重要,剩下就是api和编译了,好的电脑可以让你省很多时间,调试编译最耗时。复制一个View何时复制?我们的条件是:长按复制。给rv的item整一个长按事件,假设你已经给rv设置长按事件了,怎么实现,方法很多,这里就不展开,代码是kt的如果是java的同学看不懂那就将就将就.overridefunonItemLongClick(adapter:BaseQuickAdapter<*,*>,view:View,position:Int):Boolean{//长按事件generateItem(adapter,view,position)//消费这个长按returntrue}长按事件触发,这个容易理解,先尝试复制privatefungenerateNewItem(view:View?){view?.let{//得到当前长按view的在屏幕中位置it.getLocationOnScreen(clickPosition)//得到这个viewvalbitmap=getBitmapByItemView(view)//生成一个新的imageview,这个是因为我这里item是个图片,这个可以是任意的viewdragItem=ImageView(this)//通过bitmap复制一个出来valnewBitmap=copyItemView(bitmap)//设置这个新的view的宽高,和之前那个一样vallp=FrameLayout.LayoutParams(newBitmap.width,newBitmap.height)//把长按的时候记录的相对屏幕的坐标xy设置给新的复制品,让他们重叠在一起lp.leftMargin=clickPosition.get(0)lp.topMargin=clickPosition.get(1)-getBarHeight()//设置参数dragItem?.layoutParams=lpdragItem?.setImageBitmap(newBitmap)//我们在根布局容纳复制品的容器,显示显示,并把复制品添加到上面flMoveContent.visibility=View.VISIBLEflMoveContent.addView(dragItem)}}这里我们处理复制,和把这个复制品添加到外部容器中,接下来手指拖动的时候整个rv会滚动起来,我们需要拦截一下,拦截条件就是:触发长按后,开始拦截rv的事件,不做滚动,手指移动的时候,我们接管这个事件,包括:down,move,up处理item跟随手指移动实现接口RecyclerView.OnItemTouchListener处理是否消费事件,上面说了条件:长按触发消费,松开手指后,释放,继续让rv默认处理onInterceptTouchEvent处理具体的down,move,up,cancelonTouchEventonRequestDisallowInterceptTouchEvent适配相关配置如下privatefuninitAdapter(){//new适配器dragAdapter=DragAdapter()//关闭rv的item动画RVUtils.disableAnim(rvTestDrag)//3列的方式展示valmanager=GridLayoutManager(this,3)rvTestDrag.layoutManager=managerrvTestDrag.adapter=dragAdapter//长按事件dragAdapter.setOnItemLongClickListener(this)//item的触摸事件rvTestDrag.addOnItemTouchListener(this)dragAdapter.setNewData(list)}标记是否拦截rv的触摸overridefunonItemLongClick(adapter:BaseQuickAdapter<*,*>,view:View,position:Int):Boolean{//长按事件generateNewItem(view)//标记:当前rv不可滚动,事件拦截下来,我们自己处理rvCanMove=false//消费这个长按returntrue}这里就是处理拦截和触摸了,流程:当长按之后,我们自己处理触摸,释放手指后,触摸归还rv。触摸期间,我们需要把手指移动的坐标同步到外部的复制品中松开了,就计算距离,通过简单线性动画移动到原位。overridefunonTouchEvent(rv:RecyclerView,e:MotionEvent){//触发长按之后,item的触摸事件来到这里了.MotionEvent返回手指移动的位置.以及up事件//得到当前手指位置valx2=e.rawXvaly2=e.rawYwhen(e.action){MotionEvent.ACTION_MOVE->{valmoveX=x2-lastXvalmoveY=y2-lastYdragItem?.apply{valtranX=translationX+moveXvaltranY=translationY+moveY//移动这个复制出来的itemtranslationX=tranXtranslationY=tranY}}MotionEvent.ACTION_UP->{//判断区域,手指的位置,是否在垃圾桶矩形内if(e.rawX>=loc.get(0)&&e.rawX<=endX&&e.rawY>=loc.get(1)&&e.rawY<=endY){//当手指松开之后,标记设置rv可以自由处理触摸rvCanMove=true//根容器移除复制品,同时隐藏起来flMoveContent.removeAllViews()flMoveContent.visibility=View.GONE//TODO:2020-09-04进入矩形之后,做我们的操作,比如触发删除Toast.makeText(this,"已经收藏好了",Toast.LENGTH_SHORT).show()//deleteItem()dragAdapter.data.removeAt(currentIndex)dragAdapter.notifyDataSetChanged()}else{//恢复位置,如果item不是在垃圾桶位置,松开了.就需要返回原来的位置valcurrentLocalPosition=IntArray(2)dragItem?.apply{//得到现在复制品位置getLocationOnScreen(currentLocalPosition)//拿到位置,飞回去valani=AniUtils.getTranslateAnimation(//开始点击的位置,和现在up的位置计算出飞行的距离clickPosition.get(0)-currentLocalPosition.get(0),clickPosition.get(1)-currentLocalPosition.get(1),//动画时间1000,Animation.ABSOLUTE,false)doAnimation(this,ani)}}}}//更新最新的位置lastX=x2lastY=y2}overridefunonInterceptTouchEvent(rv:RecyclerView,e:MotionEvent):Boolean{when(e.action){MotionEvent.ACTION_DOWN->{//触发down的时候,把手指的位置记录好lastX=e.rawXlastY=e.rawY}MotionEvent.ACTION_MOVE->{//TODO:2020-09-04log,查看位置移动位置}MotionEvent.ACTION_UP->{//释放的时候,必须恢复可以滚动,移除伪装的view(复制品)resetItem()}MotionEvent.ACTION_CANCEL->{//释放的时候,必须恢复可以滚动,移除伪装的view(复制品)resetItem()}}//是否消费return!rvCanMove}最后的长按代码overridefunonItemLongClick(adapter:BaseQuickAdapter<*,*>,view:View,position:Int):Boolean{//长按的时候,把原始的item设置隐藏,显示我们复制的viewdragAdapter.data[position].isHide=truedragAdapter.notifyItemChanged(position)currentIndex=position//长按事件generateNewItem(view)rvCanMove=false//消费这个长按returntrue}我们的布局设置<?xmlversion="1.0"encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.x.rv.drag.ItemDragActivity"><!--列表距离右边100dp--><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rvTestDrag"android:layout_width="match_parent"android:background="#888888"android:layout_height="match_parent"android:layout_marginRight="100dp"/><!--矩形100*100,item到这个位置,就需要出发我们删除,屏幕最右边--><TextViewandroid:id="@+id/iv_collection"android:layout_width="100dp"android:layout_height="100dp"android:text="收入囊中"android:gravity="center"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"/><!--和根布局一样大的容器,放复制品用的,默认隐藏--><FraqmeLayoutandroid:id="@+id/flMoveContent"android:layout_width="match_parent"android:layout_height="match_parent"android:clickable="true"android:focusable="true"android:visibility="gone"/></androidx.constraintlayout.widget.ConstraintLayout>看适配器代码packagecom.x.rv.dragimportcom.chad.library.adapter.base.BaseQuickAdapterimportcom.chad.library.adapter.base.viewholder.BaseViewHolderimportcom.x.Rimportcom.x.rv.adapter.DragItemclassDragAdapter():BaseQuickAdapter<DragItem,BaseViewHolder>(R.layout.item_drag){overridefunconvert(helper:BaseViewHolder,item:DragItem){helper.setVisible(R.id.ivContent,!item.isHide)helper.setImageResource(R.id.ivContent,item.bg)}}布局<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/ivContent"android:layout_width="match_parent"android:layout_height="100dp"android:layout_margin="5dp"android:scaleType="centerCrop"android:src="@drawable/ic_on"/></RelativeLayout>总结功能主要是思路有了,再慢慢细分实现,当时写这个功能的时候ios的同事也在烦恼,做得差不多了后大家讨论实现居然神相似,哈哈。功能用到知识rv的基本数据显示长按事件复制view获取view在屏幕中位置触摸处理拦截view事件简单view动画最后看看完整的效果图如果你有更骚的方式记得来分享~
1970-01-01 00:00 · recycleview / debug / 断点 / Android
[问答] 通知UI更新

我在 ViewModel 里面得到了所需要的数据,两个同时加载view的地方都需要用到这一份数据,现在出现的情况是:

  1. 两个地方都去调用getAllInfo(), 那么就没有问题
2022-09-22 14:38 · Android
[问答] 如何在侧滑菜单中item项点击跳转到fragment
transaction.replace(R.id.drawer_view,targetment);//这个replace的参数第一id值我个人理解是要替换的布局的id值transaction.commit();我的想法觉得这个地方应该是跟领券联盟底部导航的
2020-03-06 20:13 · android
[问答] Android Service 支付宝例子中不理解的地方
publicclassPayServiceextendsService{privatestaticfinalStringTAG="PayService";privateThirdPartPayImplmThirdPartPay;@OverridepublicIBinderonBind(Intentintent){Stringaction=intent.getAction();Log.d(TAG,"onBind");if(action!=null&&"com.alibaba.alipay.THIRD_PART_PAY".equals(action)){mThirdPartPay=newThirdPartPayImpl();//----------------------------------------------}returnmThirdPartPay;//------------------------------------------}publicclassPayActionextendsBinder{publicvoidpay(floatpayMoney){Log.d(TAG,"PayActionMoney-->"+payMoney);if(mThirdPartPay!=null){mThirdPartPay.paySuccess();}}publicvoidonUserCancel(){mThirdPartPay.payFailed(1,"userCancel");}}privateclassThirdPartPayImplextendsThirdPartPayAction.Stub{privateThirdPartPayResultmCallback;@OverridepublicvoidrequestPay(StringorderInfo,floatpayMoney,ThirdPartPayResultcallback){this.mCallback=callback;Intentintent=newIntent();intent.setClass(PayService.this,PayActivity.class);intent.putExtra(Constants.KEY_BILL_INFO,orderInfo);intent.putExtra(Constants.KEY_PAY_MONEY,payMoney);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}publicvoidpaySuccess(){try{if(mCallback!=null){mCallback.onPaySuccess();}}catch(RemoteExceptione){e.printStackTrace();}}publicvoidpayFailed(interrorCode,StringerrorMsg){try{if(mCallback!=null){mCallback.onPayFailes(errorCode,errorMsg);}}catch(RemoteExceptione){e.printStackTrace();}}}}上面的和下面的,如果action正常的话,都是返回mThirdPartPay,但上面的写法,在其它app调用的时候,调用不了mThirdPartPay中的requetPay,,,,也没报错,,不理解。都是回返mThirdPartPay,一个在if里面,一个在if外面,结果却不一样,下面的是成功的,在另一个app,点击按钮,调用mThirdPartPay的requestPay方法,成功跳转到指定界面上面的,在另一个app中调用没反应,,,,还有下面中返回的newPayAction(),它在action正确的时候不会调用,那它是干嘛用的publicclassPayServiceextendsService{privatestaticfinalStringTAG="PayService";privateThirdPartPayImplmThirdPartPay;@OverridepublicIBinderonBind(Intentintent){Stringaction=intent.getAction();Log.d(TAG,"onBind");if(action!=null&&"com.alibaba.alipay.THIRD_PART_PAY".equals(action)){mThirdPartPay=newThirdPartPayImpl();//----------------------------------------------returnmThirdPartPay;}returnnewPayAction();//------------------------------------------}publicclassPayActionextendsBinder{publicvoidpay(floatpayMoney){Log.d(TAG,"PayActionMoney-->"+payMoney);if(mThirdPartPay!=null){mThirdPartPay.paySuccess();}}publicvoidonUserCancel(){mThirdPartPay.payFailed(1,"userCancel");}}privateclassThirdPartPayImplextendsThirdPartPayAction.Stub{privateThirdPartPayResultmCallback;@OverridepublicvoidrequestPay(StringorderInfo,floatpayMoney,ThirdPartPayResultcallback){this.mCallback=callback;Intentintent=newIntent();intent.setClass(PayService.this,PayActivity.class);intent.putExtra(Constants.KEY_BILL_INFO,orderInfo);intent.putExtra(Constants.KEY_PAY_MONEY,payMoney);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}publicvoidpaySuccess(){try{if(mCallback!=null){mCallback.onPaySuccess();}}catch(RemoteExceptione){e.printStackTrace();}}publicvoidpayFailed(interrorCode,StringerrorMsg){try{if(mCallback!=null){mCallback.onPayFailes(errorCode,errorMsg);}}catch(RemoteExceptione){e.printStackTrace();}}}}
2020-05-08 12:07 · Service
[问答] 喜马拉雅项目推荐界面sdk获取的数据有时显示有时不显示
为什么点一下别的地方比如订阅再返回来就会变成。。。这样:除了点别的地方,有的时候直接运行的时候也显示不出来。。日志也没啥错误。。求大佬解答。
2020-02-20 17:45 · android / 喜马拉雅 / 问答
[问答] 追加保存数据

追加保存数据到已有的txt文件里,网上百度了方法,用了好几种方法都是这两个地方出错(红色的地方2021-07-25 00:09 · 追加保存数据

[文章] Android开发中如何读取meta-data里内容呢?
这个知识点不长用,但是也有见到的地方,什么地方常用呢?一般是用于配置秘钥之类的,比如说,你要集成一个SDK,要么用静态init的形式,要么就用这个配置的形式啦。
[文章] 笔记----Android开发之全局获取Context的技巧
码代码的过程中,发现Toast在一些地方不能通过getContext、this获取上下文,百度了一下全局获取Context的技巧,记录一下首先定制一个自己的Application,需要创建一个MyApplication
2020-05-01 10:17 · 笔记 / android / Context
[问答] 对网站的建议,收集呀!来吧,同学们!
同学们在使用过程种,有没有什么不爽的地方呢?这一波收集一下大家的看法,来吧!皮卡丘们!
2019-12-29 15:23 · 意见征集 / 公告 / 官方
[文章] 怎么查找php的配置文件php.ini的位置,放在什么地方
php.ini所在路径查找方法我是要在windows服务器安装Redis服务,其中有一个步骤要修改php的配置文件php.ini,不过找不到它的位置。第一,写查找文件find.php<?phpechophpinfo();第二,将find.php文件传到windows服务器直接复制到服务器,然后在浏览器访问这个find.php文件。找到了php.ini地址有用没用,随手点个赞吧!
2020-06-04 21:52 · php配置文件 / php
[文章] Android开发RecyclerView的适配器notifyDataSetChange做了什么?
小技巧,搜索创建/赋值的地方,可以加多等号来搜索。mObservable它也是属于适配器里的对吧!那我们下一步干嘛?当然是搜索它使用的地方看看情况。
2019-11-02 21:05 · RecyclerView / 安卓开发 / 适配器 / adapter
[文章] JVM内存运行时数据区域( Run-Time Data Areas)
如果那个方法不是本地方法,那么计数器就会包含当前执行的方法地址。如果当前方法是本地方法,那么计数器里的值会是undefined。虚拟机的计数器有足够大的空间来容纳所返回的地址或者平台所执行到的地方
2020-04-25 16:24 · JVM / 内存模型 / 数据区 / 内存溢出 / 堆栈
[问答] 博客的部署问题
我打算部署到服务器上供手机客户端调用api,这个地方是填什么呢,填我购买的域名嘛
2020-10-20 22:59 · 服务器 / 部署
[文章] 内容提供者-内容观察者
也就是内容发生变化的时候,要通知到监听内容变化的地方。就是这么简单内容提供者里的内容观察者应用场景比如说我新截图,图片库里不就更新了嘛!
[文章] AndroidStudio+系统源码如何调试呢?
打断点打开源码以后,找到对应的地方打断点比如说我要看广播的发送,主要是想看看为什么开机广播静态监听不行了。于是我在![图片描述]如果直接打断点,所有的广播者被断点拦住了。
2022-10-21 14:42 · aosp / 调试 / 断点
[问答] 关于自定义控件颜色突变问题(第五部分——31小节)
并且全局查找,没有这个颜色的设置地方!这是什么原因造成的,在线求解!!!
2020-06-04 15:29 · 自定义控件 / color变异
[文章] 程序员养生知识收集
1:没药情况下,手动治疗,按穴位,2个,第一个是,耳道出来地方,大概一寸,软软的,张嘴的时候会动,不是骨头,穴位名字忘记了,把牙齿合起来,咬住不放,用一点点力按摩,感觉到酸就是了,按摩一断时间可以缓解。
2022-02-11 15:55 · 程序员养生 / 日常吐槽 / 牙痛 / 痔疮
[问答] 外部存储变内部存储了
这个不是获取的是外部sd卡路径嘛,为啥我写入之后在sd卡里找不到,反而在手机存储里找到了getFilesDIr()的路径也是这个地方,怎么回事呀
2020-05-05 22:06 · 手机存储
[文章] 阳光沙滩要拆分了:单点登陆的思路
单点登录一个地方登录,旗下所有的网站都登录了。这里面要解决一些跨域的问题,这是浏览器的安全策略。大家可以看看淘宝和天猫的案例。
2024-02-17 23:42 · 单点登录 / SSO / 多网站登录 / 阳光沙滩 / 登录
[问答] Android修改AOSP中的framework某些代码之后如何快速编译刷机

比如我修改了android-5.1.0_r3\frameworks\base\location中某个类的代码,怎么快速编译我修改过的地方,然后刷入手机呢,我现在每次修改都全量编译,我快疯了。

2022-10-18 20:53 · AOSP / framework / Android
[问答] AIDL模拟支付宝支付,调用AIDL时报错
程序走到红框处时没有捕获异常回到另一个界面,程序走完setText就报错:无法捕获远程异常,不管有没有下面的Toast都在这个地方报错!怎么解?各位大佬们!!!
2021-03-12 16:10 · AIDL / 模拟支付宝支付
[问答] 在看Camera2相机预览的代码,这个确实是没有理解

是哪一个地方理解的不对么。。还有这几个问题都没看懂 -_-||。。。

2022-04-24 21:25 · Camera2
[问答] flutter StatefulWidget 中的方法如如何在外面调用



flutter statefulwidget 中自定义了一个带有动画的组件,如何在外面调用的地方,控制动画的执行,动画控制器是写在 封装的组件里

2021-09-14 17:37 · flutter
[文章] 博客系统后端完成(使用mybatis-plus和elasticsearch改写图片上传用了阿里云oss)
-手机登录没做,还有防止重复提交的也得自己加一下,具体位置自己看todo跑起来代码需要修改的地方
2020-08-12 11:49 · Java / 后端 / 博客
[文章] [老司机]驾考避坑指南
他们收费高的地方不在这里,收费的大头在路途中的路费,考试模拟费用,餐饮费用等等。要是你补考的话,费用更高。
2022-07-18 11:11 · 驾校 / 驾考
[问答] 领卷联盟第55节,网络请求response.code是400,没找到错误的地方。。。
publicclassTicketPresenterImplimplementsITicketPresenter{@OverridepublicvoidgetTicket(Stringtitle,Stringurl,Stringcover){LogUtils.e(TicketPresenterImpl.this,"title---->"+title);LogUtils.e(TicketPresenterImpl.this,"url---->"+url);LogUtils.e(TicketPresenterImpl.this,"cover---->"+cover);Retrofitretrofit=RetrofitManager.getInstance().getRetrofit();APIapi=retrofit.create(API.class);//给url添加前缀httpsStringticketUrl=UrlUtils.getTicketUrl(url);LogUtils.e(TicketPresenterImpl.this,"ticketUrl---->"+ticketUrl);TicketParamsticketParams=newTicketParams(ticketUrl,title);Call<TicketResult>task=api.getTicket(ticketParams);task.enqueue(newCallback<TicketResult>(){@OverridepublicvoidonResponse(Call<TicketResult>call,Response<TicketResult>response){intcode=response.code();LogUtils.e(TicketPresenterImpl.this,"code---->"+code);if(code==HttpURLConnection.HTTP_OK){TicketResultresult=response.body();LogUtils.e(TicketPresenterImpl.this,"result---->"+result.toString());}}@OverridepublicvoidonFailure(Call<TicketResult>call,Throwablet){}});}@OverridepublicvoidregisterViewCallback(ITicketPagerCallbackcallback){}@OverridepublicvoidunregisterViewCallback(ITicketPagerCallbackcallback){}}publicinterfaceAPI{@GET("discovery/categories")Call<Categories>getCategories();@GETCall<HomePagerContent>getHomepagerContent(@UrlStringurl);@POST("tpwd")Call<TicketResult>getTicket(@BodyTicketParamsticketParams);}
2020-04-12 16:19 · 领卷联盟
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 9