1. 程式人生 > >android自定義介面卡

android自定義介面卡

  1. BaseAdapter:是所有介面卡類的父類,可以對列表項進行最大限度的定製
    1.1 自定義介面卡中的方法
    getCount
    getView
    getItem
    getItemId
    1.2 LayoutInflater(佈局解析器)
    –LayoutInflater有三種獲得方式,資料中有詳細介紹
    用來把layout佈局檔案解析成一個View物件,不可以new,需要使用系統服務獲得

    inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//自定義介面卡
class  MyBaseAdapter extends BaseAdapter{
      private  LayoutInflater inflater;

      public MyBaseAdapter(LayoutInflater inflater) {
            this.inflater = inflater;
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public Object getItem(int position) {
            return data.get(i);
        }

        @Override
        public long getItemId(int position) {
            return i;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
          //解析項資源
            View v = inflater.inflate(R.layout.listview_item, null);
            ImageView  iv_listviewitem_image = v.findViewById(R.id.iv_listviewitem_image);
            Book book = data.get(i);
            //把值新增的iv_listviewitem_image
            iv_listviewitem_image.setImageResource(book.getImage());
            return v;
        }
    }

案例一:ListView的使用及優化
2. ListView優化
2.1 使用ConvertView重用元件
即拖動時被遮住、看不見的控制元件,重用它,而非每次建立一個新的物件

2.2 使用內部類ViewHolder+ConvertView.setTag()儲存控制元件,而不用每次查詢
ViewHolder(檢視的持有者)

2.3 使用分頁查詢(PullToRefresh)
2.3.2 使用AsyncTask(非同步任務)載入資料,最少要重寫以下這兩個方法
doInBackground
後臺執行
onPostExecute
在doInBackground方法執行結束之後在執行,並且執行在UI執行緒當中 可以對UI空間進行設定
關鍵程式碼:
myListViewAdapter.notifyDataSetChanged();// 通知介面卡資料已改變
ptrlv_main_1.onRefreshComplete();// 通知控制元件資料已經載入完畢

2.4 事件監聽的優化
假設Item中有三個按鈕,要為三個按鈕定義事件,如果是下面這樣
btn1.setOnclickListener(new View.onClickListener(){
public void onClick(View view){
//…
}
});
btn2.setOnclickListener(new View.onClickListener(){
public void onClick(View view){
//…
}
});
btn3.setOnclickListener(new View.onClickListener(){
public void onClick(View view){
//…
}
});
如果每屏顯示10個Item,那一共建立了30個listener物件在記憶體中。
如果,你是在Adapter建立時,只建立一個Listener,並將其定義成全域性屬性,
然後通過按鈕的ID來進行判斷是哪個事件應該觸發,
class MyAdapter extends BaseAdapter{
View.onClickListener myListener = new View.onClickListener(){
public void onClick(View view){
if(view.getId() == R.id.btn1){
//…
}else if(view.getId() == R.id.btn2){
//…
}else if(view.getId() == R.id.btn3){
//…
}
}
});
}

    //註冊監聽器
    btn1.setOnclickListener(myListener);
    btn2.setOnclickListener(myListener);
    btn3.setOnclickListener(myListener);

2.5 另外,真實開發中,圖片肯定是通過網路下載,也需要通過執行緒非同步下載進行優化等等,但由於還涉及到android網路程式設計,
這部分的內容會在之後的課程中介紹

  1. 第三方控制元件:上拉載入、下拉重新整理控制元件
    3.1 匯入第三方外掛庫
    Android-PullToRefresh-master.zip

3.2 在佈局檔案中使用第三方外掛
com.handmark.pulltorefresh.library.PullToRefreshListView

3.3 自定義介面卡(BaseAdapter)提供資料

3.4 非同步任務查詢資料(AsyncTask)
3.4.1 AsyncTask定義了三種泛型型別 Params,Progress和Result。
Params 啟動任務執行的輸入引數,比如HTTP請求的URL。
Progress 後臺任務執行的百分比。
Result 後臺執行任務最終返回的結果,比如String
3.4.2 非同步載入資料最少要重寫以下這兩個方法
doInBackground(Params…) 後臺執行,比較耗時的操作都可以放在這裡
onPostExecute(Result) 相當於Handler 處理UI的方式,在這裡面可以使用在doInBackground 得到的結果處理操作UI
–注:此方法中再通知介面卡和控制元件
myBaseAdapter.notifyDataSetChanged();// 通知介面卡資料已改變
plv_main_plv1.onRefreshComplete();// 通知控制元件資料已經載入完畢

3.5 給PullToRefreshListView設定相關屬性
plv_main_1.setMode(Mode.BOTH);// 設定重新整理模式
Mode.BOTH:同時支援上拉下拉
Mode.PULL_FROM_START:只支援下拉Pulling Down
Mode.PULL_FROM_END:只支援上拉Pulling Up

  plv_main_1.getLoadingLayoutProxy().setPullLabel("上拉重新整理...");// 剛下拉時,顯示的提
  plv_main_1.getLoadingLayoutProxy().setRefreshingLabel("正在載入...");// 重新整理時
  plv_main_1.getLoadingLayoutProxy().setReleaseLabel("放開重新整理...");// 下來達到一定距離時,顯示的提示

3.6 給PullToRefreshListView設定介面卡

3.7 給PullToRefreshListView設定監聽器
監聽器有二種:第一種上拉和下拉重新整理的效果是一樣的,要想實現上拉和下拉重新整理效果不一樣就要使用第二種
setOnRefreshListener/PullToRefreshBase.OnRefreshListener

  setOnRefreshListener2/PullToRefreshBase.OnRefreshListener2

核心:
1、listview控制元件、項資源、自定義介面卡準備好
2、向服務端拿資料
3、初始化自定義介面卡(獲取檢視解析器、得到項資源的view控制元件、獲取所有的子控制元件,給子控制元件賦值、返回view)
4、繫結介面卡