使用方法:
自定义一个类使其继承BaseAdapter,再在此类中实现四个方法
<1>getCount():得到数据源中元素的个数
<2>getItem(int position):根据索引位获取指定索引位得到数据值
<3>getItemAtID(int position):根据索引位返回行号
<4>getView(int position,View convertView,ViewGroup parent):每绘制一个条目就会自动调用一次当前方法
ListView的优化:就是重用条目。
注意:这里ListView优化是有一个模型:我戏称为:"传送带模型"
示例代码:
前台展示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView_names"
/>
</LinearLayout>
后台逻辑:
package com.hsj.example.listviewwithbaseadapterdemo04;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity_bak01 extends AppCompatActivity {
private ListView listView_names;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//自动修正的快捷键alt+回车
this.listView_names= (ListView) this.findViewById(R.id.listView_names);
this.listView_names.setAdapter(new MyAdapter());
}
/**
* 面试题:自定义适配器需要继承哪个类,实现哪些方法,这些方法有什么用?
* 答:继承BaseAdapter
* 实现的方法有:
* getCount():得到数据源中元素的个数
* getItem(int position):根据索引位获取指定索引位的数据值
* getItemAtId(int position):根据索引位返回行号
* getView(int postion,View convertView,ViewGroup parent):每绘制一个条目就会自动调用一次当前方法
*
*/
private final class MyAdapter extends BaseAdapter{
/**
* 返回数据源中元素的个数
*
* 当返回值为0时,不会绘制任何条目,即不会调用getView()方法
* 当返回值为1时,绘制一个条目,即调用一次getView()方法
* 当返回值为2时,绘制两个条目,即调用两次getView()方法
* ......
* 当返回值为n 时,绘制n个条目,即调用n 次getView()方法
*
* 注意:实际绘制的条目数为=手机屏幕的高度/每一个条目的高度(如果不能整除,则取大于商的最小整数)
* @return
*/
@Override
public int getCount() {
System.out.println("==getCount()===");
return 30;
}
/**
* 根据指定的索引值返回指定索引处的元素值
* @param position
* @return
*/
@Override
public Object getItem(int position) {
System.out.println("===getItem(int position="+position+")===");
return null;
}
/**
* 根据索引位返回行号,一般和position 相等
* @param position
* @return
*/
@Override
public long getItemId(int position) {
System.out.println("==getItemId(int position="+position+")===");
return position;
}
/**
* 当每绘制一个条目时都会自动调用当前方法
* @param position 当前正在绘制条目的索引值
* @param convertView 缓存条目而存在的,当第一次绘制的条目上移,下面有新条目被绘制,此时convertView的值还是为null,
* 继续上移,直到第一次绘制的条目彻底移除我们的视线,此时下面应该会有新的条目出现了,此时出现的新条目就
* 不应该是重新实例化新的了,应该重用之前第一次移出去的条目,此时convertView 就不再为null了,它其实就是
* 第一次移除去的条目,重用即可提高效率
*
* @param parent 事件源
*
*
*
* textView0=android.widget.TextView{53510070 V.ED.... ......ID 0,0-0,0}
textView1=android.widget.TextView{53510dfc V.ED.... ......ID 0,0-0,0}
textView2=android.widget.TextView{535116d0 V.ED.... ......ID 0,0-0,0}
ListView的优化
A:重用条目
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView=null;
if(convertView==null){
textView=new TextView(MainActivity_bak01.this);
}else{
textView= (TextView) convertView;
}
System.out.println("textView"+position+"="+textView);
textView.setText("第"+position+"条数据!");
System.out.println("=====getView(int position="+position+", View convertView="+convertView+", ViewGroup parent="+parent+")====");
return textView;
}
}
}