您的位置:首页 > 移动开发 > Android开发

不可不知的android开发冷知识5

2016-01-30 21:27 417 查看
1、当使用TableLayout布局时,如果想将每列的宽度设为相同,可设置其属性:

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: