ListView控制元件
BaseAdapter:是所有介面卡類的父類,可以對列表項進行最大限度的定製 1.1 自定義介面卡中的方法 getCount getView getItem getItemId 1.2 LayoutInflater(佈局解析器) –LayoutInflater有三種獲得方式,資料中有詳細介紹 用來把layout佈局檔案解析成一個View物件,不可以new,需要使用系統服務獲得
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 案例一:ListView的使用及優化
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);
自定義介面卡:
package com.example.a6;
import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; 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 ListView lv_main_show; private List<Book> data=new BookDao().list(); private MyBaseAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_main_show=findViewById(R.id.lv_main_show); adapter=new MyBaseAdapter((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)); lv_main_show.setAdapter(adapter); } class MyBaseAdapter extends BaseAdapter{ class ViewHolder{ ImageView iv_listviewitem_image ; TextView tv_listviewitme_title; TextView tv_listviewitme_author; TextView tv_listviewitme_price; TextView tv_listviewitme_publish; TextView tv_listviewitme_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 convertView, ViewGroup parent) { View v=convertView; if (v==null){ v= inflater.inflate(R.layout.listview_item, null); ViewHolder viewHolder=new ViewHolder(); viewHolder.iv_listviewitem_image=v.findViewById(R.id.iv_listviewitem_image); viewHolder.tv_listviewitme_title=v.findViewById(R.id.tv_listviewitme_title); viewHolder.tv_listviewitme_author=v.findViewById(R.id.tv_listviewitme_author); viewHolder.tv_listviewitme_price=v.findViewById(R.id.tv_listviewitme_price); viewHolder.tv_listviewitme_publish=v.findViewById(R.id.tv_listviewitme_publish); viewHolder.tv_listviewitme_remark=v.findViewById(R.id.tv_listviewitme_remark); v.setTag(viewHolder); } ViewHolder tag = (ViewHolder) v.getTag(); Book book = data.get(i); tag.iv_listviewitem_image.setImageResource(book.getImage()); tag.tv_listviewitme_title.setText(book.getTitle()); tag.tv_listviewitme_author.setText(book.getAuthor()); tag.tv_listviewitme_price.setText(book.getPrice().toString()); tag.tv_listviewitme_publish.setText(book.getPublish()); tag.tv_listviewitme_remark.setText(book.getRemark()); return v; } } }