1. 程式人生 > >高階控制元件ListView以及自定義介面卡

高階控制元件ListView以及自定義介面卡

一 ListView 列表控制元件 使用的時候高度和寬度最好是設定為match_parent

二 自定義介面卡 1.BaseAdapter:是所有介面卡類的父類,可以對列表項進行最大限度的定製 2.寫一個類繼承自BaseAdapter,實現四個方法:

getCount :返回當前ListView或者Spinner等控制元件要顯示多少條資料

getView (int postion,View convertView,ViewGroup parent): 返回的是ListView或Spinner每一個選項的佈局,這個方法的主要作用是把每一行的檢視檔案(Layout佈局檔案)解析成一個View物件

// LayoutInflater 佈局解析器,用於把Layout佈局檔案解析成一個View物件(不可以直接new ,需要使用系統服務獲取)
    inflater= (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)~~  

getItem(int i):返回當前那一行的物件,即ListView.getSelectedItem()方法得到的值

getItemId(int i):獲取當前那一行的物件ID,返回的是ListView.getSelectedItemId()方法得到的值

注:getCount,getView方法必須實現 getItem ,getItemId可以不實現

三 ,ListView的優化 1 使用ConvertView 重用元件 即拖動時被遮住、看不見的控制元件,重用它,而非每次建立一個新的物件

2 使用內部類 每次給佈局檔案中的控制元件設定值的時候,都需要呼叫findViewById(id)方法,重複查詢浪費時間,所以把控制元件的地址儲存到一個物件中,再把物件儲存到ConvertView中,下次對控制元件設值時,直接通過修改物件即可

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

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

ListView前兩次增強程式碼如下(第三次明天更新)

 package com.example.hyt;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
  private List<Book> data;//資料來源
  private MyBaseAdapter adapter; //介面卡
 private ListView lv_main_booklist; //LisrView控制元件


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv_main_booklist=findViewById(R.id.lv_main_booklist);

    data=new BookDao().list();
    adapter=new MyBaseAdapter((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE));
    lv_main_booklist.setAdapter(adapter);
}


public class MyBaseAdapter extends BaseAdapter{//介面卡

    public class ViewHolder{//專門用來儲存控制元件
        ImageView iv_listviewitem_image;
        TextView tv_listviewitem_title;
        TextView tv_listviewitem_author;
        TextView tv_listviewitem_price;
        TextView tv_listviewitem_publishing;
        TextView tv_listviewitem_remark;

    }

    private LayoutInflater inflater;//解析器

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

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

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

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

    @Override
    public View getView(int i, View view, ViewGroup parent) {
        //被遮擋住的檢視  View view
       //1,將項資源解析成可見的檢視
        View v=view;
        if(v==null){//增強一 減少檢視的建立
            Log.i("test","position:"+i);
            v=inflater.inflate(R.layout.listview_item,null);
            
            ViewHolder vh=new ViewHolder();//增強二 減少查詢控制元件的時間
            
           vh.iv_listviewitem_image=v.findViewById(R.id.iv_listviewitem_image);
            vh.tv_listviewitem_title=v.findViewById(R.id.tv_listviewitme_title);
            vh.tv_listviewitem_author=v.findViewById(R.id.tv_listviewitme_author);
            vh.tv_listviewitem_price=v.findViewById(R.id.tv_listviewitme_price);
            vh.tv_listviewitem_publishing=v.findViewById(R.id.tv_listviewitme_publish);
            vh.tv_listviewitem_remark=v.findViewById(R.id.tv_listviewitme_remark);


             v.setTag(vh);//儲存
        }
        //2,從檢視中獲取控制元件(控制元件無值)  //增強二  減少查詢控制元件的時間(將控制元件放進ViewHolder類,專門儲存控制元件)
           ViewHolder viewHolder=(ViewHolder)v.getTag();
        // 3,獲取當前需要的資料,將值封裝進控制元件中
       Book book=data.get(i);
        viewHolder.iv_listviewitem_image.setImageResource(book.getImage());
        viewHolder.tv_listviewitem_title.setText(book.getTitle());
        viewHolder.tv_listviewitem_author.setText(book.getAuthor());
        viewHolder.tv_listviewitem_price.setText(book.getPrice()+"");
        viewHolder.tv_listviewitem_publishing.setText(book.getPublish());
        viewHolder.tv_listviewitem_remark.setText(book.getRemark());
        //將檢視返回
        return v;
    }
  }
}