Android基础之Listview的滚动事件的学习

来源:互联网 发布:js怎么设置cssimporant 编辑:程序博客网 时间:2024/06/05 23:04

## Listview的滚动事件##

ListView的另一个重要事件是列表滚动事件。列表滚动事件可以通过为ListView控件设置OnScrollListener监听器来进行处理。该监听器定义了两种事件处理方法。一个是onScrollStateChanged方法,做为滚动状态变更时的回调方法。另一个是onScoll方法,当列表滚动或快速滑动时回调。

·为ListView添加滚动事件    - setOnScrollListener(OnScrollListener listener)·OnScrollListener    - void onScrollStateChanged(AbsListView view,int scrollState)    //作为滑动状态变更时的回调方法    参数:view--事件源          scrollState--滑动状态用常量表示        SCROLL_STATE_IDLE:空闲状态        SCROLL_STATE_TOUCH_SCROLL:滑动状态或手指未离开屏幕        SCROLL_STATE_FLING:快速滑动状态    - void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount,int totalItemCount)    //当列表滚动或快速滑动时回调    参数:view--事件源          firstVisivleItem--滑动状态中能被看到的item          visibleItemCount--可以被看到的item数量和          totalItemCount--总数据长度

示例:
在上一篇案例上添加:
首先在适配器中添加:

public void addMusic(ArrayList<Music> music) {        if(music !=null){        this.music = music;        notifyDataSetChanged();        }    }

其次在activity中添加addlistener方法并修改adapter初始化数据:
adapter = new MusicAdapter(this, MusicBiz.getMusic(poge++));

private void addListener(){        lvMusic.setOnScrollListener(new OnScrollListener() {            private int visibleItem;            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {                if(scrollState == OnScrollListener.SCROLL_STATE_IDLE                        && visibleItem == adapter.getCount()-1){                    ArrayList<Music> musics = MusicBiz.getMusic(poge++);                    adapter.addMusic(musics);                    adapter.notifyDataSetChanged();                }            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem,                    int visibleItemCount, int totalItemCount) {                visibleItem = firstVisibleItem + visibleItemCount -1;            }        });    }

快速滚动时使用懒加载模式优化音乐列表

所谓懒加载模式是指在ListView快速滑动时,不加载和更新列表项中的耗时数据。当快速滑动停止时才开始更新。从而避免用户快速滑动过程中造成ListView的加载负担过重
案例:
修改MusicAdapter中的代码:

package com.cainiao.adapter;import java.util.ArrayList;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MusicAdapter extends BaseAdapter {    private ArrayList<Music> music;    private LayoutInflater inflater;    private boolean idle;    public void setIdle(boolean idle) {        this.idle = idle;    }    public MusicAdapter(Context context,ArrayList<Music> music) {        if(music != null){        this.music = music;        }else{            music = new ArrayList<Music>();        }        this.inflater = LayoutInflater.from(context);        this.setIdle(true);    }    public void addMusic(ArrayList<Music> music) {        if(music !=null){        this.music = music;        notifyDataSetChanged();        }    }    @Override    public int getCount() {        return music.size();    }    @Override    public Object getItem(int position) {        return music.get(position);    }    @Override    public long getItemId(int position) {        return music.get(position).getId();    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        //加载item到view        ViewHolder holder;        if(convertView == null){            convertView = inflater.inflate(R.layout.item, null);            holder = new ViewHolder();            holder.tvName = (TextView) convertView.findViewById(R.id.tv_Name);            holder.tvAlbum = (TextView) convertView.findViewById(R.id.tv_Album);            holder.tvArtist = (TextView) convertView.findViewById(R.id.tv_Artist);            holder.tvduration = (TextView) convertView.findViewById(R.id.tv_Duration);            convertView.setTag(holder);        }else{            holder = (ViewHolder) convertView.getTag();        }        if(idle){        //根据位置从集合中获取一条数据        Music m = music.get(position);        //将数据加写在item view上        holder.tvName.setText(m.getName());        holder.tvAlbum.setText(m.getAlbum());        holder.tvArtist.setText(m.getArtist());        holder.tvduration.setText(m.getDuration());        }        //返回绑定了数据的item view        return convertView;        /*//加载item到view        View v = inflater.inflate(R.layout.item, null);        TextView tvName = (TextView) v.findViewById(R.id.tv_Name);        TextView tvAlbum = (TextView) v.findViewById(R.id.tv_Album);        TextView tvArtist = (TextView) v.findViewById(R.id.tv_Artist);        TextView tvDurstion = (TextView) v.findViewById(R.id.tv_Duration);        //根据位置从集合中获取一条数据        Music m = music.get(position);        //将数据加写在item view上        tvName.setText(m.getName());        tvAlbum.setText(m.getAlbum());        tvArtist.setText(m.getArtist());        tvDurstion.setText(m.getDuration());        //返回绑定了数据的item view*/           }    class ViewHolder{        private TextView tvName,tvAlbum,tvArtist,tvduration;    }}

在activity中添加addListenerll方法:

private void addListenerll(){        lvMusic.setOnScrollListener(new OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {                switch (scrollState) {                case OnScrollListener.SCROLL_STATE_IDLE:                    adapter.setIdle(true);                    adapter.notifyDataSetChanged();                    break;                case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:                case OnScrollListener.SCROLL_STATE_FLING:                    adapter.setIdle(false);                    break;                default:                    break;                }            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem,                    int visibleItemCount, int totalItemCount) {                // TODO Auto-generated method stub            }        });    }
0 0
原创粉丝点击