ListView中加载多种布局

需求:

  • list集合保存的对象中保存一个字段:

    • isTitle:boolean类型,区别对象的种类,根据标记,加载不同布局
  • 代码:

      class MyAdapter extends BaseAdapter {
          @Override
          public int getCount() {
              return list.size();
          }
          @Override
          public AppInfo getItem(int position) {
              return list.get(position);
          }
          @Override
          public long getItemId(int position) {
              return position;
          }
          //重点!!!
          @Override
          public int getViewTypeCount() {
              return 2;
          }
          //重点!!!
          @Override
          public int getItemViewType(int position) {
              AppInfo info = list.get(position);        //获取每个条目的显示对象,返回每个条目的标志位
              if (info.isTitle) {
                  return TYPE_TITLE;
              } else {
                  return TYPE_NORMAL;
              }
          }
          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
              if (getItemViewType(position) == TYPE_NORMAL) {
                  ViewHolder holder;
                  if (convertView == null) {     //加载一般布局
                      convertView = View.inflate(getApplicationContext(), R.layout.app_info_item, null);
                      holder = new ViewHolder(convertView);
                      convertView.setTag(holder);
                  } else {
                      holder = (ViewHolder) convertView.getTag();
                  }
                  AppInfo info = getItem(position);
                  holder.tvName.setText(info.name);
                  holder.ivIcon.setImageDrawable(info.icon);
                  holder.tvSize.setText(Formatter.formatFileSize(getApplicationContext(), info.size));
                  holder.tvLocation.setText(info.isSdcard ? "外置存储卡" : "手机内存");
              } else {         //加载标题布局
                  TextView tvTitle = null;
                  if (convertView == null) {
                      convertView = View.inflate(getApplicationContext(), R.layout.app_title_item, null);
                  }
                  tvTitle = (TextView) convertView.findViewById(R.id.title_item);
                  AppInfo info = getItem(position);
                  if (position == 0) {
                      tvTitle.setText(info.title + "(" + userList.size() + ")");
                  } else {
                      tvTitle.setText(info.title + "(" + systemList.size() + ")");
                  }
              }
              return convertView;
          }
      }
    
      static class ViewHolder {
          @BindView(R.id.iv_icon)
          ImageView ivIcon;
          @BindView(R.id.tv_name)
          TextView tvName;
          @BindView(R.id.tv_location)
          TextView tvLocation;
          @BindView(R.id.tv_size)
          TextView tvSize;
    
          ViewHolder(View view) {
              ButterKnife.bind(this, view);
          }
      }
    
  • 加个多个不同布局时候,需要重写getItemViewType方法,根据返回值int类型,判断加载布局的类型

  • 需要重写getViewTypeCount,返回值为填充布局种类的个数

  • 自定义标志要从0开始

      private static final int TYPE_TITLE = 0; //标题栏类型
      private static final int TYPE_NORMAL = 1; //一般布局
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容