一、holder的错误:
android中经常会用到listview。在给listview填充数据时,为了提高效率,通常会使用holder来封装控件及其数据。使用方法如下:
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView != null && convertView instanceof RelativeLayout) {
view = convertView;
holder = (ViewHolder) view.getTag();
} else {
view = View.inflate(Activity_TaskManager.this,
R.layout.item_taskmanager, null);
holder = new ViewHolder();
holder.icon = (ImageView) view.findViewById(R.id.iv_taskicon);//一定不要再忘记在findViewById前面 加 view
holder.name = (TextView) view.findViewById(R.id.tv_appname);
holder.size = (TextView) view.findViewById(R.id.tv_tasksize);
holder.cb=(CheckBox) view.findViewById(R.id.cb_taskmanager);
view.setTag(holder);
}
if (position == 0) {
TextView tv_usetask = new TextView(Activity_TaskManager.this);
tv_usetask.setBackgroundColor(Color.GRAY);
tv_usetask.setTextColor(Color.BLUE);
tv_usetask.setText("用户进程(" + usetaskinfos.size() + ")");
return tv_usetask;
} else if (position == usetaskinfos.size() + 1) {
TextView tv_usetask = new TextView(Activity_TaskManager.this);
tv_usetask.setBackgroundColor(Color.GRAY);
tv_usetask.setTextColor(Color.BLUE);
tv_usetask.setText("系统进程(" + systemtaskinfos.size() + ")");
return tv_usetask;
} else if (position <= usetaskinfos.size()) {
int newposition = position - 1;
tb = usetaskinfos.get(newposition);
} else {
int newposition = position - 1 - usetaskinfos.size() - 1;
tb = systemtaskinfos.get(newposition);
}
holder.icon.setImageDrawable(tb.getIcon());
holder.name.setText(tb.getApkname());
holder.size.setText(tb.getRamsize()+"");
return view;
}
在这里需要注意几点:
1、getView这个方法主要是填充布局的。在第一个if判断中,当convertView !=null时,我们除了需要吧convertView 的内容赋值给view视图对象外,还需要把view里面的数据传递给holder。
2、holder的声明一般放在填充view布局的后面,初始化holder。方便调用holder。
3、声明完holder对象,别忘了设置给view对象。
二、handler的错误:
在使用子线程处理耗时的操作时子线程会给handler发送消息,这个消息必须写在子线程的run()里面,否则就是无效的。
如下:
// 初始化数据
private void initData() {
new Thread() {
public void run() {
usetaskinfos = new ArrayList();
systemtaskinfos = new ArrayList();
taskinfos = TaskInfoParser
.getRunningtask(Activity_TaskManager.this);
for (TaskBean info : taskinfos) {
if (info.isUsetask()) {
usetaskinfos.add(info);
} else {
systemtaskinfos.add(info);
}
}
handler.sendEmptyMessage(0);//写在run()里面才是正确的
}
}.start();
}