高階控制元件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;
}
}
}