如何实现复杂的listview的效果

如何实现复杂的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;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值