ListView滾動到底部自動加載數據

jopen 9年前發布 | 35K 次閱讀 ListView Android開發 移動開發

在 Android中有很多時候會選擇用ListView加載數據,有的是分批加載,比如每次加載20條,100條就要加載5次,如果一次性加載100 條,ListView加載就會變慢,如果是有圖片的話,一是浪費流量,二是item中帶圖片會出現錯位的問題l,ListView加載數據目前好多App 的做法

1. 分批加載,滑動到底部自動更新

2. 滑動到底部,手動的點擊加載更多

3. 下拉刷新 + 底部加載更多

今天實現ListView滑動到底部自動更新的效果。

原理:監聽ListView的滑動事件,判斷ListView是否滑動到底部,然后去加載數據。

    public class MainActivity extends Activity {  
        private ListView listview;  
        private List<String> datas;  
        private LayoutInflater inflater;  
        private MyAdapter adapter;  
        private List<String>  contents;  
        private int count = 0;  
        private View footView;  
        private Handler handler = new Handler();  
        int lastItem;  
        private RelativeLayout loading;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
            initData();  
            inflater = LayoutInflater.from(this);  
            listview = (ListView) findViewById(R.id.listview);  
            adapter = new MyAdapter();  
            footView = inflater.inflate(R.layout.footer, null);  
            loading = (RelativeLayout) footView.findViewById(R.id.loading);  
            //listview的addFooterView()添加view到listview底部一定要加在listview.setAdapter(adapter);這代碼前面  
            listview.addFooterView(footView);  
            listview.setAdapter(adapter);  
            //添加listview滾動監聽  
            listview.setOnScrollListener(new OnScrollListener() {  
                //AbsListView view 這個view對象就是listview  
                @Override  
                public void onScrollStateChanged(AbsListView view, int scrollState) {  
                    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
                        if (view.getLastVisiblePosition() == view.getCount() - 1) {  
                            loadData();  
                        }  
                    }  
                }  
                @Override  
                public void onScroll(AbsListView view, int firstVisibleItem,  
                        int visibleItemCount, int totalItemCount) {  
                       lastItem = firstVisibleItem + visibleItemCount - 1 ;  
                }  
            });  
        }  
        protected void loadData() {  
            loading.setVisibility(View.VISIBLE);  
            handler.postDelayed(new Runnable() {  
                @Override  
                public void run() {  
                     load();  
                     loading.setVisibility(View.GONE);  
                     adapter.notifyDataSetChanged();  
                }  
            }, 5000);  
        }  
        protected void load() {  
            int count = adapter.getCount() + 1;  
            for(int i = count; i < count + 20; i++) {  //每次加載20條數據
                 contents.add("加載數據:::" + i);  
            }  
        }  
        private void initData() {  
            contents = new ArrayList<String>();  
            for(int i = 1; i < 20; i++){  
                contents.add("加載數據:::" + i);  
            }  
        }  

        class MyAdapter extends BaseAdapter{  
            @Override  
            public int getCount() {  
                return contents.size();  
            }  
            @Override  
            public Object getItem(int position) {  
                return contents.get(position);  
            }  

            @Override  
            public long getItemId(int position) {  
                return position;  
            }  

            @Override  
            public View getView(int position, View convertView, ViewGroup parent) {  
                ViewHolder holder;  
                if(convertView == null){  
                    convertView = inflater.inflate(R.layout.item, parent, false);  
                    holder = new ViewHolder();  
                    holder.tvContent = (TextView) convertView.findViewById(R.id.tvContent);  
                    convertView.setTag(holder);  
                }else{  
                    holder = (ViewHolder) convertView.getTag();  
                }  
                holder.tvContent.setText(contents.get(position));  
                return convertView;  
            }  
            class ViewHolder{  
                TextView tvContent;  
            }  
        }  
    }  

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!