1.布局文件中ImageView有警告时为它加上contentDescription项
2.继承Adapter的GetView函数的正确用法:使用ViewHolder来控制之前已经产生了的ChildView(converView),如果converView存在则直接取得存放在tag中的ViewHolder来设置需要改变的项.
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
FileData fd = items.get(position);
if(convertView==null) {
holder = new ViewHolder();
holder.icon = new ImageView(FileSelectAcitvity.this);
holder.text = new TextView(FileSelectAcitvity.this);
holder.text.setTextColor(0xFFFFFFFF);
LinearLayout ll = new LinearLayout(FileSelectAcitvity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setVerticalGravity(Gravity.CENTER);
ll.addView(holder.icon);
ll.addView(holder.text);
ll.setTag(holder);
convertView = ll;
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(fd.name);
if(fd.type==0)
holder.icon.setImageResource(R.drawable.folder);
else if(fd.type==1)
holder.icon.setImageResource(R.drawable.default2);
else
holder.icon.setImageResource(R.drawable.notes);
return convertView;
}
public final class ViewHolder {
public ImageView icon;
public TextView text;
}
这样写的原因是因为这样能产生最少的view,每次只产生能看见的view的数量.并且能够防止内存泄露.
3.handler的postDelayed方法只是伪多线程异步处理,真正的多线程用Thread类来实现
Thread th_convert_word = new Thread(new Runnable(){
@Override
public void run() {
int length = doc.characterLength();
for (int i = 0; i < length-1; i+=range_size) {
int end = i + range_size;
if(i+range_size>length-1)
end = length-1;
Range r = new Range(i, end, doc);
try {
doc2html(file_md5,doc,r,i/range_size);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
th_convert_word.start();
4.poi下WordToHtmlConverter的processDocument在安卓下报错,下载poi的源码跟踪调试后发现在下面出错:
//package org.apache.poi.hwpf.converter
//AbstractWordUtils.java
static void compactChildNodesR( Element parentElement, String childTagName )
{
NodeList childNodes = parentElement.getChildNodes();
for ( int i = 0; i < childNodes.getLength() - 1; i++ )
{
Node child1 = childNodes.item( i );
Node child2 = childNodes.item( i + 1 );
if ( !WordToFoUtils.canBeMerged( child1, child2, childTagName ) )
continue;
// merge
while ( child2.getChildNodes().getLength() > 0 )
child1.appendChild( child2.getFirstChild() );
child2.getParentNode().removeChild( child2 );
//i--;
}
childNodes = parentElement.getChildNodes();
for ( int i = 0; i < childNodes.getLength() - 1; i++ )
{
Node child = childNodes.item( i );
if ( child instanceof Element )
{
compactChildNodesR( (Element) child, childTagName );
}
}
}
出错在removeChild这句,child2已经没有item继续调用该句的话就会出错,注释掉i--重新编译就没有报错了,怀疑是代码bug?
5.链式调用,诸如以下好玩的东西
public class Test{
int integer;
public Test t1(){
integer +=1;
return this;
}
public Test t2(){
integer -=1;
return this;
}
}
Test t = new Test();
t.t1().t2();
6.多线程中:
永远不要用stop().
interrupt()是在有block method时用的,如sleep().
终结线程的唯一方法是让run()跑完.
中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停止正在运行的任务.线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务.
7.用作互斥加锁的对象最好不要用来当标志
8.主线程handler的正确写法(用弱应用获得类的操作权)
//主线程的消息队列处理器
MyHandler main_thread_handler = new MyHandler(this);
static class MyHandler extends Handler {
WeakReference<MainActivity> mActivity;
public MyHandler(MainActivity activity) {
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
if(((String)msg.getData().get("msg")).equals("update")){
MainActivity main = mActivity.get();
String url="file:///sdcard/cloudshare/temp/" + main.file_md5 + "/doc" + msg.getData().getString("pager") + ".html";
main.web_now.loadUrl(url);
}
super.handleMessage(msg);
}
}
1、
getView执行的次数和你的getCount没有直接的关系 ,getCount和你listView里面的条目数量(行数量)有关系 ,getView方法执行次数取决于你屏幕上显示几个条目,比如你有100行 ,但是你一屏只能显示5行,那么启动程序的时候 系统调用5次getView方法,当你把listView往下拉的时候会显示出其他未显示的行,这样系统就会调用getView方法,每显示一个新的行就调用一次getView,所以你要是不停的上下滑动listVew那getView理论上是可以调用任意次数的
2、
此问题在于,ListView没有取到实际的高度,无法确定取多少View来填充ListView,也就是运行getView()的具体运行次数。
3、
应该把listiview在布局文件中的高度设置为:fill_parent
continue...