如何实现复杂的listview的效果
public class AppManagerActivity extends Activity implements OnClickListener {
private ArrayList<AppInfo> mList;// 所有已安装应用的集合
private ArrayList<AppInfo> mUserList;// 所有已安装用户应用的集合
private ArrayList<AppInfo> mSystemList;// 所有已安装系统应用的集合
private ListView lvList;
private AppInfoAdapter mAdapter;
private TextView tvHeader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_manager);
lvList = (ListView) findViewById(R.id.lv_list);
tvHeader = (TextView) findViewById(R.id.tv_header);
lvList.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (mUserList != null && mSystemList != null) {
if (firstVisibleItem <= mUserList.size()) {
tvHeader.setText("用户应用(" + mUserList.size() + ")");
} else {
tvHeader.setText("系统应用(" + mSystemList.size() + ")");
}
}
}
});
initData();
}
}
private void initData() {
llLoading.setVisibility(View.VISIBLE);
new Thread() {
@Override
public void run() {
mList = AppInfoProvider
.getIntalledApps(getApplicationContext());
// 区分用户和系统应用,分别放在两个集合中
mUserList = new ArrayList<AppInfo>();
mSystemList = new ArrayList<AppInfo>();
for (AppInfo info : mList) {
if (info.isUser) {
mUserList.add(info);
} else {
mSystemList.add(info);
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter = new AppInfoAdapter();
lvList.setAdapter(mAdapter);
llLoading.setVisibility(View.GONE);
}
});
}
}.start();
}
class AppInfoAdapter extends BaseAdapter {
@Override
public int getCount() {
// return mList.size();
return mUserList.size() + mSystemList.size() + 2;// 增加两个标题栏
}
@Override
public AppInfo getItem(int position) {
if (position == 0 || position == mUserList.size() + 1) {
// 碰到标题栏了
return null;
}
if (position < mUserList.size() + 1) {
return mUserList.get(position - 1);// 减掉1个标题栏
} else {
return mSystemList.get(position - mUserList.size() - 2);// 减掉两个标题栏
}
}
@Override
public long getItemId(int position) {
return position;
}
// 表示listview展示的布局种类数量, 只有重写此方法,系统才会缓存相应个数的convertView
@Override
public int getViewTypeCount() {
return 2;
}
// 根据当前位置返回不同布局类型
// 注意: 类型必须从0开始计数
@Override
public int getItemViewType(int position) {
if (position == 0 || position == mUserList.size() + 1) {
// 碰到标题栏了
return 0;// 标题栏类型
} else {
return 1;// 普通类型
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 判断当前布局类型, 系统会根据当前布局类型,返回响应类型的convertView对象
int type = getItemViewType(position);
switch (type) {
case 0:// 标题类型
HeaderHolder hHolder = null;
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),
R.layout.list_item_header, null);
hHolder = new HeaderHolder();
hHolder.tvHeader = (TextView) convertView
.findViewById(R.id.tv_header);
convertView.setTag(hHolder);
} else {
hHolder = (HeaderHolder) convertView.getTag();
}
if (position == 0) {
hHolder.tvHeader.setText("用户应用(" + mUserList.size() + ")");
} else {
hHolder.tvHeader
.setText("系统应用(" + mSystemList.size() + ")");
}
break;
case 1:// 普通类型
// View view = null;
ViewHolder holder = null;
if (convertView == null) {
convertView = View.inflate(getApplicationContext(),
R.layout.list_item_appinfo, null);
holder = new ViewHolder();
holder.tvName = (TextView) convertView
.findViewById(R.id.tv_name);
holder.tvLocation = (TextView) convertView
.findViewById(R.id.tv_location);
holder.ivIcon = (ImageView) convertView
.findViewById(R.id.iv_icon);
convertView.setTag(holder);
} else {
// view = convertView;
holder = (ViewHolder) convertView.getTag();
}
AppInfo info = getItem(position);
holder.tvName.setText(info.name);
holder.ivIcon.setImageDrawable(info.icon);
if (info.isRom) {
holder.tvLocation.setText("手机内存");
} else {
holder.tvLocation.setText("外置存储卡");
}
break;
}
return convertView;
}
}
static class ViewHolder {
public TextView tvName;
public TextView tvLocation;
public ImageView ivIcon;
}
static class HeaderHolder {
public TextView tvHeader;
}
}