Android回顧--(十) ListView的優化和多佈局複用

weixin_34320159發表於2018-07-27

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


    7156039-a1c638ee04fa8112.png
    自定義OnScrollListener.png

    7156039-e0e1ca5d25e912e1.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"   //水平間距

相關文章