不可不知的android开发冷知识5
2016-01-30 21:27
417 查看
1、当使用TableLayout布局时,如果想将每列的宽度设为相同,可设置其属性:
2、当一个很长的数据向一个很大的表做插入操作时,如果不想插入重复数据且每条数据都有主键,可以使用以下语句:
3、SQL查询时去掉重复的值
如果是存在两条完全相同的记录,可以用distinct关键字来去掉,如:
但是如果存在部分字段相同且有主键而又不想要某字段数据重复的,可以使用group by 来排除:
4、当在list中删除对象时(如Student对象student),如果调用list.remove(student)时,发现删除不了。原因是list里保证的是对象引用的唯一性,并不是对象值的唯一性,该student可能经过数据变换后,虽然值与list里的student完全相同,但是已经不是原来的student的引用对象,因此不能删除。
解决的办法是重写Student类的equal方法,使list能够判定要删除的对象与List里的对象值相同,从而能够删掉。同理,重写equal方法后还会发现list.contain(Object)方法也能够判定某个对象是否在list中,方便很多。而且重写equal方法后对list里对象值的唯一性很有帮助。
5、当对EditText的内容进行删除监听时,发现按下删除键后里面的逻辑执行了两次。原因是按下删除键后会有两个动作,一个是按键up,一个是按键down,因此可以这样判断:
如果在执行逻辑后返回true,则该逻辑结束后删除的动作也就完成,如果返回false,则会提交给默认实现方式.
6、JAVA中常常要判断某个字符串是否为数字,这里有一个简单的方法可以实现:
7、很多时候我们需要将list1中的数据(如Student对象集students)复制到list2中,但是如果直接用list2 = list1,这个时候其实两者用的是同一套对象,list1只是把它自身对象的引用地址传给了list2,因此如果list1中的数据改变,list2的数据也会改变。如果我们想要真正复制数据,则可以重写Student类里的clone方法
重写的类需要实现Cloneable接口。
然后就可以在复制中使用:
这样就能得到两个数据相同的list了。
8、如果要使Notification常驻通知栏(即不可滑动清除)可设置:
设置为true即不可删除,false为可删除。
9、Java中wait、sleep、notify、notifyAll的区别:
wait和sleep都会导致当前线程的暂停,不同的是wait会丢掉当前获得的lock,直到持有lock的线程使用notify或者notifyAll才会被唤醒,而sleep则不会。就好像图书馆有一本书,wait就相同于你原来看着这本书,睡觉后把书放回原位,这样别人就能够再拿来看,来看的人觉得书挺不错,于是把你叫醒道谢,而sleep则是你拿着这本书睡觉了,这样别人也看不了。
notify唤醒的是一个阻塞的线程,notifyAll则唤醒的是所有阻塞的线程。这个比较容易理解。
10、当我们的布局中既使用了listView又使用了ScrollowView的时候,会发现如果listView在ScrollowView里面的话,listView滚动不了。原因是ScrollowView把滚动的事件全部占用了。所以listView得不到滚动的事件。解决的办法是在该Activity中重写disPatchTouchEvent(MotionEvent ev)方法将事件分发给listView。
android:stretchColumns="*"
2、当一个很长的数据向一个很大的表做插入操作时,如果不想插入重复数据且每条数据都有主键,可以使用以下语句:
insert ignore into table(属性1,属性2,属性3) values(属性值1,属性值2,属性值3) 或者 replace into table(属性1,属性2,属性3) values(属性值1,属性值2,属性值3)
3、SQL查询时去掉重复的值
如果是存在两条完全相同的记录,可以用distinct关键字来去掉,如:
select distinct * from table(表名) where xxx(条件)
但是如果存在部分字段相同且有主键而又不想要某字段数据重复的,可以使用group by 来排除:
select * from table where id(主键) in (select max(id) from table group by name(想去除重复的字段名))
4、当在list中删除对象时(如Student对象student),如果调用list.remove(student)时,发现删除不了。原因是list里保证的是对象引用的唯一性,并不是对象值的唯一性,该student可能经过数据变换后,虽然值与list里的student完全相同,但是已经不是原来的student的引用对象,因此不能删除。
解决的办法是重写Student类的equal方法,使list能够判定要删除的对象与List里的对象值相同,从而能够删掉。同理,重写equal方法后还会发现list.contain(Object)方法也能够判定某个对象是否在list中,方便很多。而且重写equal方法后对list里对象值的唯一性很有帮助。
5、当对EditText的内容进行删除监听时,发现按下删除键后里面的逻辑执行了两次。原因是按下删除键后会有两个动作,一个是按键up,一个是按键down,因此可以这样判断:
mTitleField.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN){ // 执行逻辑…… return true; } return false; } });
如果在执行逻辑后返回true,则该逻辑结束后删除的动作也就完成,如果返回false,则会提交给默认实现方式.
6、JAVA中常常要判断某个字符串是否为数字,这里有一个简单的方法可以实现:
public static boolean isNumber(String str){ // 判断数字的正则表达式,当然也可以用作其他正则表达式 String regex = "[0-9]*"; Pattern pattern = Pattern.compile(regex); return pattern.matcher(str).matches(); }
7、很多时候我们需要将list1中的数据(如Student对象集students)复制到list2中,但是如果直接用list2 = list1,这个时候其实两者用的是同一套对象,list1只是把它自身对象的引用地址传给了list2,因此如果list1中的数据改变,list2的数据也会改变。如果我们想要真正复制数据,则可以重写Student类里的clone方法
public class Student implements Cloneable{ private String name; private int age; private String num; @Override protected Student clone() throws CloneNotSupportedException { Student student = null; student = (Student)super.clone(); return student; } }
重写的类需要实现Cloneable接口。
然后就可以在复制中使用:
for (Student student : list1){ try { list2.add(student.clone()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } }
这样就能得到两个数据相同的list了。
8、如果要使Notification常驻通知栏(即不可滑动清除)可设置:
builder.setOngoing(true)
设置为true即不可删除,false为可删除。
9、Java中wait、sleep、notify、notifyAll的区别:
wait和sleep都会导致当前线程的暂停,不同的是wait会丢掉当前获得的lock,直到持有lock的线程使用notify或者notifyAll才会被唤醒,而sleep则不会。就好像图书馆有一本书,wait就相同于你原来看着这本书,睡觉后把书放回原位,这样别人就能够再拿来看,来看的人觉得书挺不错,于是把你叫醒道谢,而sleep则是你拿着这本书睡觉了,这样别人也看不了。
notify唤醒的是一个阻塞的线程,notifyAll则唤醒的是所有阻塞的线程。这个比较容易理解。
10、当我们的布局中既使用了listView又使用了ScrollowView的时候,会发现如果listView在ScrollowView里面的话,listView滚动不了。原因是ScrollowView把滚动的事件全部占用了。所以listView得不到滚动的事件。解决的办法是在该Activity中重写disPatchTouchEvent(MotionEvent ev)方法将事件分发给listView。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_MOVE){ listView.disPatchTouchEvent(ev); } return super.dispatchTouchEvent(ev); }
相关文章推荐
- Android开发 解决"ADB Not Responding"ADB占用冲突
- Android性能优化
- Android PopupWindow显示位置和显示大小
- Android布局优化之merge标签
- Android双击back按钮退出实现
- Android特色服务之传感器
- android *** Activity 03
- 利用统计学知识为android应用的启动时间做数据分析
- android学习网址收藏
- Android 基础—— 对Context的理解与使用技巧
- Android Gallery组件实现循环显示图像
- Android Studio 修改 Logcat 颜色
- Android反射机制
- android BaseAdapter的getView的调用时机
- 02Android用户界面优化之(一)Android Fragment
- Android 四大组件 —— 广播(广播机制解析)
- Android寒假实训云笔记总结——欢迎页
- Android-动画提升-基于游戏引擎libGDX-动画开发
- android中读取properties文件
- Android Studio主要目录及文件简介