您的位置:首页 > 其它

ListView进阶

2015-12-16 11:59 531 查看

ListView的事件监听

onItemClick: Item项点击事件

onItemLongClick: Item项长按事件

使用方法跟Button的点击事件一样,可以继承接口,再实现抽象方法,也可以直接使用匿名内部类的方式,使用其接口里的抽象方法。

listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

switch (position) {

position形参,就是表示listview里第几行,行数是从0开始数。

listView1.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

@Override

public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

return false;

}

});

这里可以看到,长按事件是有返回值的,与点击事件不一样。那么这个返回值有什么作用呢?

Return true 表示消化掉事件,不继续传递;

Return false表示不消化事件,继续传递事件。

在这里,我希望你们能够进行一个实验,用Toast进行输出,对listview同时设置点击事件和长按事件。修改Return false不同的返回值,好好的理解一下事件传递的意思。

ListView优化(超级干货,进阶高手)

1.掌握ConvertView的原理和使用

2.掌握ViewHolder的原理和使用

之前我们学习到自定义BaseAdapter实现getView方法时,用到了两个方法,一是inflate方法,二是findViewById方法。然而,这两个方法都是耗时的操作。

inflate方法:获取布局对象;

findViewById 方法:获取控件对象。

优化的策略:原本每一次getView都会进行上述两个方法,我们的思路就是,尽量缩短这两个方法调用的次数。

解决方案:

1.inflate方法耗时时,用convertView解决(一级优化)

2.findViewById方法耗时,用ViewHolder解决(二级优化)

(一级优化)

@Override

public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = inflater.inflate(R.layout.listcontact_item, null);

}

TextView tvname = (TextView) convertView.findViewById(R.id.tvName);

TextView tvphonenumber = (TextView) convertView.findViewById(R.id.tvPhoneNumber);

ImageButton ibphone = (ImageButton) convertView.findViewById(R.id.ibPhone);

......

return convertView;

}

如下图:item1划出屏幕,就将item1的视图加进回收器Recycler,item8划入屏幕,就直接从回收器Recycler里得到item1的对象,用来描绘item8,这样就不必重新加载反射视图。



本来listview中有一千行,要至少反射一千次,现在有了这个优化后,只要反射8次(因为item1要完全划出屏幕,才能加入回收器)。

(二级优化)

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHodler hodler = null;

if (convertView == null) {

convertView = inflater.inflate(R.layout.listcontact_item, null);

hodler = new ViewHodler();

hodler.tvname = (TextView) convertView.findViewById(R.id.tvName);

hodler.tvphonenumber = (TextView) convertView.findViewById(R.id.tvPhoneNumber);

hodler.ibphone = (ImageButton) convertView.findViewById(R.id.ibPhone);

convertView.setTag(hodler);

} else {

hodler = (ViewHodler) convertView.getTag();

}

Map map = list.get(position);

hodler.tvname.setText((String) map.get("tvName"));

hodler.tvphonenumber.setText((String) map.get("tvPhoneNumber"));

hodler.ibphone.setImageResource((Integer) map.get("ibPhone"));

return convertView;

}

public class ViewHodler {

TextView tvname;

TextView tvphonenumber;

ImageButton ibphone;

}

区别就在于,多增加了一个类ViewHodler 。我们用这个类来创建引用变量。当生成convertView的时候,我们也new一个ViewHodler对象。如果之前已经通过findViewById来获得对象,它已经创建,那么我们就从convertView的getTag方法得到该对象。然后之后就不需要再进行findViewById。

我们优化的方式,总结来说,就是尽可能地减少反射操作,尽可能地去掉绝大部分的耗时操作,以让用户感受到丝质顺滑的感受。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: