ListView之BaseAdapter

直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,因为这会涉及到ListView优化等问题。

第一种没有任何处理,数据少量的时候可以,如果数据量大了就会出现卡

public classMyAdapterNormalextendsBaseAdapter {

privateLayoutInflatermInflater=null;

privateContextcontext;

privateList>data;

publicMyAdapterNormal(Context context, List> data)

{

this.context= context;

this.mInflater= LayoutInflater.from(context);

this.data= data;

}

@Override

public intgetCount() {

//适配器中所代表的数据集中的条目数

returndata.size();

}

@Override

publicObject getItem(inti) {

//获取数据集中与制定索引对应的数据项

returni;

}

@Override

public longgetItemId(inti) {

//列表中指定索引对应的行id

returni;

}

@Override

publicView getView(inti, View view, ViewGroup viewGroup) {


view =mInflater.inflate(R.layout.list_item,null);

ImageView img = (ImageView)view.findViewById(R.id.img);

TextView title = (TextView)view.findViewById(R.id.title);

TextView info = (TextView)view.findViewById(R.id.info);

img.setImageResource(R.drawable.call);//control+c和control+v添加图片

title.setText((String)data.get(i).get("title"));

info.setText((String)data.get(i).get("info"));

return view;

}


}

//--------------------------------------------------note

LayoutInflater这个类还是非常有用的,它的作用类似于

findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而

findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。

具体作用:

1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

LayoutInflater 是一个抽象类,在文档中如下声明:

public abstract class LayoutInflater extends Object

获得 LayoutInflater 实例的三种方式

1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater()

2. LayoutInflater inflater = LayoutInflater.from(context);

3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService

(Context.LAYOUT_INFLATER_SERVICE);

//----------------------------------------------

第二种,ListView优化:通过缓存view,这种利用缓存view的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能

publicView getView(inti, View view, ViewGroup viewGroup) {

if(view ==null){       

view =mInflater.inflate(R.layout.list_item,null);

  }

ImageView img = (ImageView)view.findViewById(R.id.img);

TextView title = (TextView)view.findViewById(R.id.title);

TextView info = (TextView)view.findViewById(R.id.info);

img.setImageResource(R.drawable.call);

title.setText((String)data.get(i).get("title"));

info.setText((String)data.get(i).get("info"));

returnview;

}

第三种,ListView优化:通过缓存view+viewHolder来实现,viewHolder就是一个静态类,使用viewHolder的关键好处是缓存了显示数据的视图(view),加快了UI的响应速度当我们判断view== null的时候,如果为空,就会根据设计好的List的Item布局(XML),来为view赋值,并生成一个viewHolder来绑定view里面的各个View控件(XML布局里面的那些控件)。再用view的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出如果view不为空的时候,就会直接用view的getTag(),来获得一个ViewHolder。

public classMyAdapterNormalextendsBaseAdapter {

privateLayoutInflatermInflater=null;

privateContextcontext;

privateList>data;

publicMyAdapterNormal(Context context, List> data)

{

this.context= context;

this.mInflater= LayoutInflater.from(context);

this.data= data;

}

@Override

public intgetCount() {

//适配器中所代表的数据集中的条目数

returndata.size();

}

@Override

publicObject getItem(inti) {

//获取数据集中与制定索引对应的数据项

returni;

}

@Override

public longgetItemId(inti) {

//列表中指定索引对应的行id

returni;

}

@Override

publicView getView(inti, View view, ViewGroup viewGroup) {

ViewHolder holder;

if(view ==null){

holder =newViewHolder();

view =mInflater.inflate(R.layout.list_item,null);

holder.img= (ImageView)view.findViewById(R.id.img);

holder.title= (TextView)view.findViewById(R.id.title);

holder.info= (TextView)view.findViewById(R.id.info);

view.setTag(holder);

}else{

holder = (ViewHolder)view.getTag();

}

holder.img.setImageResource(R.drawable.call);

holder.title.setText((String)data.get(i).get("title"));

holder.info.setText((String)data.get(i).get("info"));

returnview;

}

static  classViewHolder{

publicImageViewimg;

publicTextViewtitle;

publicTextViewinfo;

}

}

//--------------note

ViewHolder模式通过getView()方法返回的视图的标签(Tag)中存储一个数据结构,这个数据结构包含了指向我们

要绑定数据的视图的引用,从而避免每次调用getView()的时候调用findViewById())

public classMainActivityextendsAppCompatActivity {

privateListViewlv;

privateList>data;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

lv= (ListView)findViewById(R.id.listV);

data= getData();

MyAdapterNormal adapter =newMyAdapterNormal(this,data);

lv.setAdapter(adapter);

}

privateList> getData(){

List> list =newArrayList>();

Map map;

for(inti =0;i <20;i++){

map =newHashMap();

map.put("img", R.drawable.call);

map.put("title","跆拳道");

map.put("info","快乐源于生活...");

list.add(map);

}

returnlist;

}

}

//-----------------------------------------------------------------------------------------

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.8888.myapplication0.MainActivity">

android:id="@+id/listV"

android:layout_width="match_parent"

android:layout_height="match_parent">

//-----------------------------------------------------------------------------------------


android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/img"

android:layout_width="50dp"

android:layout_height="50dp"/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="18sp"/>

android:id="@+id/info"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textSize="14sp"/>

       

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容