在onCreate()方法中加载数据,加载数据可能比较耗时,我们需要将其放到子线程中进行处理:
/**
* 加载数据
*/
private void fillData() {
ll_loading.setVisibility(View.VISIBLE);
new Thread() {
public void run() {
allTaskInfos = TaskInfoProvider
.getTaskInfo(getApplicationContext());
userTaskInfos = new ArrayList<TaskInfo>();
systemTaskInfos = new ArrayList<TaskInfo>();
for (TaskInfo taskInfo : allTaskInfos) {
if (taskInfo.isUserTask()) {
userTaskInfos.add(taskInfo);
} else {
systemTaskInfos.add(taskInfo);
}
}
handler.sendEmptyMessage(0);
};
}.start();
}
将用户进程和系统进程信息添加到相应的集合中,handler发送消息,通知界面更新:设置Adapter:
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
ll_loading.setVisibility(View.GONE);
adapter = new TaskManagerAdapter();
lv_task_manager.setAdapter(adapter);
};
};
自定义Adapter,继承自BaseAdapter,这个布局和软件管理的界面差不多一样,如下:
private class TaskManagerAdapter extends BaseAdapter {
@Override
public int getCount() {
return userTaskInfos.size() + 1 + systemTaskInfos.size() + 1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TaskInfo taskInfo;
if (position == 0) {// 用户进程的标签
TextView tv = new TextView(getApplicationContext());
tv.setText("用户进程:" + userTaskInfos.size() + "个");
tv.setTextColor(Color.WHITE);
tv.setBackgroundColor(Color.GRAY);
return tv;
} else if (position == (userTaskInfos.size() + 1)) {
TextView tv = new TextView(getApplicationContext());
tv.setText("系统进程:" + systemTaskInfos.size() + "个");
tv.setTextColor(Color.WHITE);
tv.setBackgroundColor(Color.GRAY);
return tv;
} else if (position <= userTaskInfos.size()) {
taskInfo = userTaskInfos.get(position - 1);
} else {
taskInfo = systemTaskInfos.get(position - 1
- userTaskInfos.size() - 1);
}
View view;
ViewHolder viewHolder;
if (convertView != null && convertView instanceof RelativeLayout) {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
} else {
view = View.inflate(getApplicationContext(),
R.layout.list_item_taskinfo, null);
viewHolder = new ViewHolder();
viewHolder.iv_task_icon = (CircleImageView) view
.findViewById(R.id.iv_task_icon);
viewHolder.tv_task_name = (TextView) view
.findViewById(R.id.tv_task_name);
viewHolder.tv_task_memsize = (TextView) view
.findViewById(R.id.tv_task_memsize);
view.setTag(viewHolder);
}
viewHolder.iv_task_icon.setImageDrawable(taskInfo.getIcon());
viewHolder.tv_task_name.setText(taskInfo.getName());
viewHolder.tv_task_memsize.setText("内存占用:"
+ Formatter.formatFileSize(getApplicationContext(),
taskInfo.getMemSize()));
return view;
}
@Override
public Object getItem(int position) {
TaskInfo taskInfo;
if (position == 0) {
return null;
} else if (position == (userTaskInfos.size() + 1)) {
return null;
} else if (position <= userTaskInfos.size()) {
taskInfo = userTaskInfos.get(position - 1);
} else {
taskInfo = systemTaskInfos.get(position - 1
- userTaskInfos.size() - 1);
}
return taskInfo;
}
@Override
public long getItemId(int position) {
return 0;
}
}
static class ViewHolder {
CircleImageView iv_task_icon;
TextView tv_task_name;
TextView tv_task_memsize;
}
这部分有个小bug,假如没有ListView的滚动事件,设置小标签的位置,那么在adapter中的position==0小标签的文字出不来,不明白为什么。
效果图:
前面提到的bug的解决:设置ListView的setOnScrollListener既可以解决。