美文网首页Android技术知识Android开发Android开发经验谈
Android回顾--(十)ListView的优化和多布局复用

Android回顾--(十)ListView的优化和多布局复用

作者: 一只胖胖胖胖猿 | 来源:发表于2018-07-27 16:10 被阅读7次

LIstView常用的三方法

  1. addHeaderView:这个方法的作用是在LIstView的顶部添加一个View
  2. addFooterView:在ListView的底部添加一个View
  3. setEmptyView:当ListView数据为空的时候,显示一个对应的View
LayoutInflater inflater = getLayoutInflater(); //把这个布局整成View
View headView=inflater.inflate(R.layout.list_item_headview,null);
View footView=inflater.inflate(R.layout.list_item_footview,null);
mListView.addHeaderView(headView);
mListView.addFooterView(footView);
TextView textView=new TextView(GoodListViewActivity.this);
textView.setText("没有数据");
textView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
textView.setGravity(Gravity.CENTER);
mListView.setEmptyView(textView);
mListView.setAdapter(adapter);  //给ListView添加顶部或者底部信息一定是在 setAdapter之前

ListView的优化

  1. 复用convertView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView==null){    //复用convertView
        convertView=inflater.inflate(R.layout.list_infor_item,null);
        //初始化那个viewHolder的对象
        viewHolder=new ViewHolder();
        //找控件
        viewHolder.img=(ImageView) convertView.findViewById(R.id.mImageView);
        viewHolder.lastInfor=(TextView) convertView.findViewById(R.id.mTextViewLastInfor);
        viewHolder.userName=(TextView) convertView.findViewById(R.id.mTextViewUserName);
        viewHolder.time=(TextView) convertView.findViewById(R.id.mTextViewTime);
                //给这个convertView设置一个tag相当于:是将ViewHolder暂时装进了convertView
        convertView.setTag(viewHolder);
    }else{
        //从convertView里面将viewHolder取出来
        viewHolder=(ViewHolder) convertView.getTag();   //减少了那个findViewById的次数
    }
    //img先丢这里.
    viewHolder.lastInfor.setText(lists.get(position).getLastInfor());
    viewHolder.userName.setText(lists.get(position).getUserName());
    viewHolder.time.setText(lists.get(position).getTime());
    new MyAsyncTask(viewHolder.img).execute(lists.get(position).getImg());
    return convertView;
        }
    }
  1. 使用静态的ViewHolder来保存模板这样可以减少findViewById的次数。
    /**
     * 静态的ViewHolder模板
     * @author apple
     *
     */
    static class ViewHolder{
        ImageView img;
        TextView userName;
        TextView lastInfor;
        TextView time;
    }

ListView的上拉加载:

  1. 通过setOnScrollListener给ListView设置滚动事件
  2. 自定义一个类实现OnScrollListener


    自定义OnScrollListener.png
    头部和底部.png

ListView的多布局复用:

  1. 初始化数据源
  2. 编写适配器
    • 声明静态模板的对象
    • ListView在实现多布局复用时需要多重写两个方法:
      a. getViewTypeCount:获取ListView中布局的种类
      b. getItemViewType:获取每个布局的类型
  3. getView中应该分情况给Item设置内容

GridView网格视图

解析数据和适配器与ListView相同
GridView布局中特有的属性:

 android:numColumns="3" //列数
 android:verticalSpacing="2dp"  //垂直间距
 android:horizontalSpacing="2dp"   //水平间距

相关文章

网友评论

    本文标题:Android回顾--(十)ListView的优化和多布局复用

    本文链接:https://www.haomeiwen.com/subject/kifgmftx.html