ListView进阶

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_itemnull);
    }

    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进阶_第1张图片


本来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_itemnull);
        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。

 

    我们优化的方式,总结来说,就是尽可能地减少反射操作,尽可能地去掉绝大部分的耗时操作,以让用户感受到丝质顺滑的感受。


你可能感兴趣的:(listview进阶)