ListView相关
ListView的setOnItemClickListener无效
问题:使用listview的时候遇到了设置item监听事件的时候在没有回调onItemClick 方法的问题
我的情况是在item中有一个Button按钮,所以不会回调。
解决:
法1. 在checkbox、button对应的view处加
1 | android:focusable=”false” |
法2. 在item最外层添加属性
1 | android:descendantFocusability=”blocksDescendants” |
原因:当listview中包含button,checkbox等控件的时候,android会默认将focus给了这些控件,也就是说listview的item根本就获取不到focus,所以导致onitemclick时间不能触发
ArrayIndexOutOfBoundsException with custom Android Adapter for multiple views in ListView
listView
有多种布局,可能是getItemViewType()
>= getViewTypeCount()
导致的(检查getViewTypeCount()
的值是不是写死了)
ListView滑动到标题栏、导航栏上
现象:出现滑动ListView滑动到标题栏上、导航栏上。点击标题栏上tab(多tab页面)此tab会刷新成原来没有被覆盖的样子。
寻找问题的经历的步骤:
1、猜测是 PagerSlidingTabStrip(PagerSlidingTabStrip+Viewpager+Fragment)导致的,故替换成TabLlayout+ViewPager+Fragment来实现。结果还是不行
2、替换Activity、Adapter,只留item布局不一样,发现问题依然存在。所以定位问题是出在item布局上。查看了item布局发现有
替换了com.u1city.androidframe.customView.FilletFrameLayout为RelativeLayout发现正常了。但是圆角没有了,所以自定义圆角RelativeLayout,但是问题又出现了。所以定位到问题是圆角导致的。
最终版本:最外层用RelativeLayout,里面的圆角再通过别的方式来实现。
ListView套多个Editext和多个RatingBar错乱问题
解决代码:
1 | public class ToEvaluateAdapter extends BaseAdapter { |
在ListView历史复用中Edittext数据显示混乱
解决在ListView历史复用中Edittext数据显示混乱
1 | //大部分情况下,getview中有if必须有else |
自己挖的坑,为空的时候设置了setHintText没有设置setText导致其他item项的EditText也会显示当前item的值
解决在ListView历史复用中Edittext数据显示混乱
ExpandListView
ExpandListView滑动过程中发现显示错位问题
过程中出现错位问题:隐藏区域上划时显示出图片,本应该显示文字。
发现错误原因:
View childView =convertView;
View childView1 =convertView;
1 | getGroupView中写法为: |
1 | ChildHolder childHolder; |
正确源码:
1 | package rongshanghui.tastebychance.com.rongshanghui.zwdt.hdly; |
NestedScrollView相关
问题:NestedScrollView嵌套 RecyclerView,页面载入时总是滑到最底部
原因:由于 NestedScrollView 嵌套 RecyclerView,RecyclerView 占据焦点会导致 NestedScrollView 内容上滑
解决:
方法一:
在根布局设置android:descendantFocusability="blocksDescendants"
其中android:descendantFocusability
有三种值:
beforeDescendants
:viewGroup 会优先其子类控件而获取到焦点afterDescendants
:viewGroup 只有当其子类控件不需要获取焦点时才获取焦点blocksDescendants
:viewGroup会覆盖子类控件而直接获得焦点
这种方法会造成页面中 EditText 焦点被抢导致无法输入,需要用第二种方法。
方法二:
1 | android:focusable="true" |
方法三:
在NestedScrollView
顶部第一个控件使用:
1 | android:focusable="true" |
这种方法不太可靠,因为有时可行,有时不可行。
Called attach on a child which is not detached: ViewHolder
问题:java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder
我是在使用RecyclerView更新了某个item的数据,调用notifyItemChanged()的时候出现的这个问题。具体也没有报是哪一行的问题,根据错误提示,意思是操作的这个viewholder当前不是被绑定的,因为RecyclerView有缓存机制,未在屏幕上显示的item会被暂时回收,即detached。
1、出现这个问题的原因是更新了不在屏幕中显示的item,解决办法是判断要更新的item是不是在屏幕中,判断方法是获取RecyclerView的LayoutManager,前提是RecyclerView设置的LayoutManager是LinearLayoutManager。获取第一个可见位置和最后一个可见位置的position,判断当前要更新的item的position在这个范围内才更新。
1 | LinearLayoutManager linearManager = (LinearLayoutManager) recyclerView.getLayoutManager(); |
2、但是我的列表只有一条数据,并且是在屏幕中显示的,我在notifyItemChanged(0)还是报了这个错,经过仔细研究代码,我发现我的RecyclerView添加了Header,这样position=0的位置其实是header,所以出现了这样的问题。所以更新List中position位置的数据后要更新的Adapter的位置是position+1,改成notifyItemChanged(1)之后问题解决。
spinner相关
问题:自定义的适配
自定义的适配器问题:spinner在xml中需要记住设备background为null 才可以显示出下拉标志
如果打算修改文字离下拉标志的距离可以通过设置在适配器中的padding来设置。因为这里的设置会直接影响默认位置的距离
点9图相关
问题:点9图片导致其上图片显示未全屏问题
问题描述:
在app启动之后出现了启动页,在启动页上方会覆盖一张广告图。而广告图显示异常:只显示在左上角(屏幕2190x1900而广告图大小431x91)
处理过程:
断点得知是这个广告图所在的ImageView的大小 getWidth()和getMeasureWidth()都是431,尝试在此ImageView前面动态设置大小:用了重新设置setLayoutParam,无效
比对上一版的apk是正常,尝试从svn上找动到的文件➡️找到了是启动页由原来的png改成点9图。
原因:点9图的左侧上侧有拉伸,而右侧下侧是限制显示区域却没有设置,只设置了左侧和上侧。
解决:右侧、下侧都弄上“黑边”
问题:点9图,出现“Error:Execution failed for task ‘:app:mergeDebugResources’”
排查:
- 检查图片是否是通过工具转成点9图的(不是手动改的后缀)
- 检查图片后缀名称是否是“.9.png.png”等两个后缀名,要保留一个
- 左、上可以分段黑边,右、下只能一条黑边
Popupwindow
Unable to add window
问题:Unable to add window – token null is not valid; is your activity running?
解决:不能在onCreate()中直接调用显示popupwindow
更改成在触发点击事件后才显示
popupwindow的showAsDropDown失效
解决popupwindow的showAsDropDown失效问题
1 | if (Build.VERSION.SDK_INT >= 24){ |
tablayout
tablayout点击显示灰色背景
解决:添加了app:tabBackground="@color/white"
其他
setVisibility无效问题
现象:view.setVisibility(View.INVISIBLE);
无效
原因一:对这个view
设置了动画,且给此动画加了属性 anim.setFillAfter(true);
解决:
- 方案一:
1 | anim.setFillAfter(false); |
- 方案二:
1 | view.clearAnimatio (); |
- 方案三:
1 | view.postdelay延迟100毫秒 |
- 方案四:
1 | 使用runOnUiThread的方式来实现 |
如果上述方案都不可行,检查Mainifest.xml
,去除android:hardwareAccelerated="false"
对于其他原因,在setVisibility
隐藏之后加个刷新。view.invalidate()
或view.postinvalidate()
。前面俩无效再试试自身requestLayout()
或父容器的requestLayout()
来强制页面刷新。
The layout in layout has no declaration in the base layout folder
解决:选择“Invalidata and Restart”重启AS