使用方法:
自定义一个类使其继承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; } } }