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不同的返回值,好好的理解一下事件传递的意思。
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。
我们优化的方式,总结来说,就是尽可能地减少反射操作,尽可能地去掉绝大部分的耗时操作,以让用户感受到丝质顺滑的感受。