Android开发的一点点小细节
前言
千里之堤毁于蚁穴,一个APP崩溃何尝也不是这样呢,其实很多时候都是因为平时没有注意一些小细节。现在就来分享下一些我平时开发过程中注意的一些事,当然我最开始也是没有注意的,从而导致出现了一系列的大问题。
- 使用switch case 不要忘记最后加break来退出。
- ListView的item不能为fragment,因为fragment是由fragmentmanage来进行管理,listview的item是由adapter进行管理。
- ListView获取它的item view是通过 view= (View) listView.getAdapter().getItem(i); i就是对应的位置,如果使用了viewholder,那么就应该用现在屏幕的那个item的 postion减去我们需要获取的那个postion。
- java中对象要比较是否相同,一次new出来的情况下比较才会返回true,否则为flase
- Cursor正确的遍历方法
//cursor不为空,moveToFirst为true说明有数据
if(cursor!=null&&cursor.moveToFirst()){
do{
}while(cursor.moveToNext);
}
不然容易出现漏掉的数据(我在读取手机联系人和短信的时候就碰到过这种坑)
- 比较两个list当中不同的元素
public List<String> getDiffElementUseMap(List<String> list1,List<String> list2){
long runtime = System.nanoTime();//开始计时
//利用map中不能有重复元素的特点
Map<String, Integer> map = new HashMap<String, Integer>(list1.size()+ list2.size());
List<String> diffList = new ArrayList<String>();//用于保存两个list中不同的元素
for (String string : list1) {
map.put(string,flagUnique);//先将list1中元素复制到map中保存
}
for (String string : list2) {
Integer key = map.get(string);// 获得键值
if (key != null) {//如果map中已经存在该元素,说明list1中存在该元素,那么将其key加1
map.put(string, ++key);
continue;
}else{//如果不存在,则放入map中
map.put(string,flagUnique);
}
}
for (Map.Entry<String, Integer> entry : map.entrySet()){
if (entry.getValue() == flagUnique)//在map中,键值为flagUnique的元素即为无重复的元素
{
diffList.add(entry.getKey());
}
}
return diffList;
}
- 广播注册与反注册,注销广播时要确认该广播是否注册
- 获取LinearLayout宽高度
由于Android程序的运行机制决定了无法再组件类外部使用getWidth和getHeight方法获得高度和宽度(在自定义组件类中可以实现),必须使用View.getMeasuredWidth和View.getMeasureHeight方法获得当前组件的宽度和高度,在调用这两个方法之前,必须调用View.measure方法先测量组件宽度和高度。
如果想直接获取在布局文件中定义的组件的宽度和高度,可以直接使用
View.getLayoutParams().width和View.getLayoutParams().height
View view = getLayoutInflater().inflate(R.layout.activity_main, null);
LinearLayout linearlayout = (LinearLayout)view.findViewById(R.id.linearlayout);
//measure方法的参数值都设为0即可
linearlayout.measure(0,0);
//获取组件宽度
int width = linearlayout.getMeasuredWidth();
//获取组件高度
int height = linearlayout.getMeasuredHeight();
*ScrollView嵌套ListView或者RecyclerView,ListView会把上面的布局顶上去
解决方法,取消掉listview的焦点
lv.setFocusable(false);
-
List遍历优化
for循环
访问成员变量比访问本地变量慢得多,如下面一段代码:for(int i =0; i < this.mCount; i++) {}
永远不要在for的第二个条件中调用任何方法,如下面一段代码:for(int i =0; i < this.getCount(); i++) {}
对上面两个例子最好改为:int count = this.mCount; / int count = this.getCount();
for(int i =0; i < count; i++) {}
触摸事件拦截
public abstract void requestDisallowInterceptTouchEvent (boolean disallowIntercept)
子View如果不希望其父View拦截Touch事件时,可调用此方法。当disallowIntercept这个参数为true时,父View将不拦截。
可以通过getParent.requestDisallowInterceptTouchEvent(true);基本数据类型转换成String
把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+””最慢初次提交到github上报 failed to push some refs to git此错误
出现错误的主要原因是github中的README.md文件不在本地代码目录中
需要通过下面代码进行合并
git pull --rebase origin master
然后在提交 git push -u origin master
git回滚任意版本
首先 git reflog 查看全部版本
然后 git reser --hard 版本号 提示 HEAD is now at 版本号 test 代表成功
最后强制提交
git push -f origin master
-
字符串比较,和判断字符串是否为空
比如说我要比较time是否为字符串1
写法如下:
if( "1".equals(time)){
}判断一个字符是否为空可以像下面这样写
if(TextUtils.isEmpty(time)){
}以上就一些平时开发过程中总结出来的小细节,欢迎指出一些不足...