getCount():获取数据总长度
getItem(int position)获取当前下标item的数据
getItemId(int position) 获取当前下标item的id 如果实体类里有从实体类里获取 没有 position
getView(int position, View convertView, ViewGroup parent) 返回当前下标item的视图
3,使用ViewHolder 减少查找控件的次数(将控件打包ViewHolder,将ViewHolder放到convertView当convertView不为空时将ViewHolder取出)
MainActivity
package com.qf.day08_listview_demo3_baseadapter; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.qf.day08_listview_demo3_baseadapter.adapter.MyBaseAdapter; import com.qf.day08_listview_demo3_baseadapter.bean.Data; public class MainActivity extends Activity implements OnClickListener{ private ListView lv; private List list; private MyBaseAdapter adapter; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取控件 lv = (ListView) findViewById(R.id.lv); //没有数据时展示 tv = (TextView) findViewById(R.id.tv); // // //获取头布局 // View headerView = getLayoutInflater().inflate(R.layout.header_layout, null); // // //头布局中控件的事件监听 // ImageView ivHeader = (ImageView) headerView.findViewById(R.id.iv_header); // ivHeader.setOnClickListener(this); // // //listView 添加头布局 // lv.addHeaderView(headerView); // // //listView 添加尾 // View footView = getLayoutInflater().inflate(R.layout.footer_layout, null); // lv.addFooterView(footView); // //获取数据源 getData(); //获取Adapter实例 adapter = new MyBaseAdapter(list, MainActivity.this); //将数据展示到ListView lv.setAdapter(adapter); //lv中没有数据时展示View,有数据不展示View lv.setEmptyView(tv); //listView item 点击事件 lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView> parent, View view, int position, long id) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "==>"+position, Toast.LENGTH_SHORT).show(); //将数据清空 // list.removeAll(list); // //更新adapter(刷新界面) // adapter.notifyDataSetChanged(); } }); //item的长点击监听方法 lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "长点击:"+list.get(position).getTitle(), Toast.LENGTH_SHORT).show(); //长点击:0.18s 如果返回值false 长按事件和其他事件都处理 如果返回值true 只处理长按事件 return true; } }); } public void getData(){ list = new ArrayList(); for(int i=0;i<50;i++){ list.add(new Data(R.drawable.ic_launcher, "title"+i, "desc"+i)); } } @Override public void onClick(View v) { // TODO Auto-generated method stub //Toast.makeText(MainActivity.this, "点击header", Toast.LENGTH_SHORT).show(); } }
Data(实体类):
package com.qf.day08_listview_demo3_baseadapter.bean; public class Data { private int imagUrl;//图片地址 private String title;//标题 private String desc;//内容 public Data(int imagUrl, String title, String desc) { super(); this.imagUrl = imagUrl; this.title = title; this.desc = desc; } public int getImagUrl() { return imagUrl; } public void setImagUrl(int imagUrl) { this.imagUrl = imagUrl; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }
MyBaseAdapter
package com.qf.day08_listview_demo3_baseadapter.adapter; import java.util.List; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.qf.day08_listview_demo3_baseadapter.R; import com.qf.day08_listview_demo3_baseadapter.bean.Data; /** * 1,创建一个类继承BaseAdapter 2,实现BaseAdapter里的方法 getCount():获取数据总长度 getItem(int * position)获取当前下标item的数据 getItemId(int position) 获取当前下标item的id 如果实体类里有从实体类里获取 * 没有 position getView(int position, View convertView, ViewGroup parent) * 返回当前下标item的视图 * */ public class MyBaseAdapter extends BaseAdapter { private List list; private Context context; public MyBaseAdapter(List list, Context context) { this.list = list; this.context = context; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Log.e("AAA", "===position==" + position + "==convertView==" + convertView); // ********************* 第一次:没有优化************************ // //布局找到 // View view = LayoutInflater.from(context).inflate(R.layout.item, // parent, false); // // //找到控件 // ImageView iv = (ImageView) view.findViewById(R.id.iv); // TextView tvTitle = (TextView) view.findViewById(R.id.tv_title); // TextView tvDesc = (TextView) view.findViewById(R.id.tv_desc); // // //控件设置数据 // Data data = list.get(position); // iv.setImageResource(data.getImagUrl()); // tvTitle.setText(data.getTitle()); // tvDesc.setText(data.getDesc()); // // ********************第二种优化*************************************** // if (convertView == null) { // convertView = LayoutInflater.from(context).inflate(R.layout.item, // parent, false); // // 布局找到 // // View view = LayoutInflater.from(context).inflate(R.layout.item, // // parent, false); // } // // // 找到控件 // ImageView iv = (ImageView) convertView.findViewById(R.id.iv); // TextView tvTitle = (TextView) // convertView.findViewById(R.id.tv_title); // TextView tvDesc = (TextView) convertView.findViewById(R.id.tv_desc); // // // 控件设置数据 // Data data = list.get(position); // iv.setImageResource(data.getImagUrl()); // tvTitle.setText(data.getTitle()); // tvDesc.setText(data.getDesc()); // ***********************第三种优化*************************************** // 声明持有控件class(箱子) ViewHolde viewHolde = null; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false); // 持有控件的class(箱子)实例化 viewHolde = new ViewHolde(); // 将持有控件的class(箱子)里的控件 找到 // 找到控件 viewHolde.iv = (ImageView) convertView.findViewById(R.id.iv); viewHolde.tvTitle = (TextView) convertView .findViewById(R.id.tv_title); viewHolde.tvDesc = (TextView) convertView .findViewById(R.id.tv_desc); // 将持有控件的class(箱子) 放到item里(车里) convertView.setTag(viewHolde); } // else { // // convertView不为空 // // 持有控件的class(箱子)从convertView拿出来 // viewHolde = (ViewHolde) convertView.getTag(); // } // 控件设置数据 Data data = list.get(position); viewHolde.iv.setImageResource(data.getImagUrl()); viewHolde.tvTitle.setText(data.getTitle()); viewHolde.tvDesc.setText(data.getDesc()); return convertView; } // 持有控件的class(箱子) class ViewHolde { ImageView iv; TextView tvTitle; TextView tvDesc; } }