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; } } }