zoukankan      html  css  js  c++  java
  • Android下拉刷新上拉更多瀑布流(附源码)

    关于瀑布流,我相信有很多朋友经常会用到.但是呢我们经常也会遇到这个问题,比如瀑布流不能下拉刷新,或者上拉更多,有的是一个简单的touch事件监听上拉加载更多,但是很显然,这样的功能以及用户体验得不到提高.所以,今天抽空把那个可以下拉上拉的瀑布流开发出来,其中借鉴了一位大仙的下拉上拉控件.我们现在开始看下效果图

    由于模拟器屏幕太小,所以我先设置他一排显示两张图片,可以很明显的看到下拉刷新和上拉加载更多.

    现在来看下我们的MainActivity.java

    package com.fay.pullwaterfall;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Display;
    import android.view.LayoutInflater;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.LinearLayout.LayoutParams;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.ImageLoader;
    import com.android.volley.toolbox.ImageLoader.ImageListener;
    import com.android.volley.toolbox.Volley;
    import com.fay.pullwaterfall.PullToRefreshView.OnFooterRefreshListener;
    import com.fay.pullwaterfall.PullToRefreshView.OnHeaderRefreshListener;
    /**
     * waterfall with refreshing and loading more
     * @since 2014/05/26
     * @author Fay
     * {@link 1940125001@qq.com}
     */
    public class MainActivity extends Activity implements OnHeaderRefreshListener,
            OnFooterRefreshListener {
        private String TAG = "MainActivity";
        
        private Display display = null;
        
        /**
         * the width of item
         */
        private int itemWidth = 0;
        
        /**
         * the count of every column
         */
        private int column_count = 2;
        
        /**
         * refresh for message.what
         */
        private final int MSG_WHAT_REFRESH = 1;
        
        /**
         * load more for message.what
         */
        private final int MSG_WHAT_MORE = 2;
        
        /**
         * refresh or load more view
         */
        private PullToRefreshView mPullToRefreshView = null;
        
        /**
         * the list of children containers
         */
        private ArrayList<LinearLayout> containerList = null;
        
        /**
         * the whole container for waterfall
         */
        private LinearLayout waterfallContainer = null;
        
        /**
         * open source dealing with photos
         */
        private ImageLoader mImageLoader = null;
        
        /**
         * the current list of image's URLs
         */
        private List<String> currentDownloadList = new ArrayList<String>();
        
        /**
         * the total list of images's URLs
         */
        private List<String> imageUrlsList = new ArrayList<String>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main1);
            RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
            mImageLoader = new ImageLoader(mQueue, BitmapCache.getInstance());
            initData();
            initView();
        }
        
        /**
         * initialize the view
         */
        private void initView() {
            mPullToRefreshView = (PullToRefreshView) findViewById(R.id.main_pull_refresh_view);
            mPullToRefreshView.setOnHeaderRefreshListener(this);
            mPullToRefreshView.setOnFooterRefreshListener(this);
            
            display = this.getWindowManager().getDefaultDisplay();
            
            itemWidth = display.getWidth() / column_count;
            
            waterfallContainer = (LinearLayout) this.findViewById(R.id.waterfall_container);
            
            containerList = new ArrayList<LinearLayout>();
            for (int i = 0; i < column_count; i++) {
                LinearLayout itemLayout = new LinearLayout(this);
                LinearLayout.LayoutParams itemParam = new LinearLayout.LayoutParams(
                        itemWidth, LayoutParams.WRAP_CONTENT);
                itemLayout.setPadding(2, 2, 2, 2);
                itemLayout.setOrientation(LinearLayout.VERTICAL);
    
                itemLayout.setLayoutParams(itemParam);
                containerList.add(itemLayout);
                waterfallContainer.addView(itemLayout);
            }
            addItemsToContainer(currentDownloadList);
        }
        
        /**
         * to refresh waterfall 
         * @param List<String> imgNameList
         */
        public void refreshContainer(List<String> imgNameList) {
            int columnNumber = 0;
            imageUrlsList.clear();
            imageUrlsList.addAll(imgNameList);
            //remove all children images
            for (int index = 0; index < column_count; index ++) {
                containerList.get(index).removeAllViews();
            }
            
            for (int index = 0; index < imageUrlsList.size(); index ++) {
                //check the  current column index by the position of the list
                columnNumber = index % column_count; 
                addImage(imageUrlsList.get(index), columnNumber);
            }
            
        }
        
        /**
         * add items to waterfall
         * @param imgNameList
         */
        public void addItemsToContainer(List<String> imgNameList) {
            int columnNumber = 0;
            int usualListLength = imageUrlsList.size();
            imageUrlsList.addAll(imgNameList);
            for (int index = usualListLength; index < imageUrlsList.size(); index ++) {
                //check the  current column index by the position of the list
                columnNumber = index % column_count; 
                addImage(imageUrlsList.get(index), columnNumber);
            }
        }
        
        /**
         * add ImageView into container
         * @param String url
         * @param int columnIndex
         */
        private void addImage(String url, int columnIndex) {
            ImageView itemImage = (ImageView) LayoutInflater.from(this).inflate(R.layout.waterfallitem, null);
            ImageListener listener = ImageLoader.getImageListener(itemImage, R.drawable.default_photo, R.drawable.default_photo);
            mImageLoader.get(url, listener);
            containerList.get(columnIndex).addView(itemImage);
        }
        
       @Override
        public void onFooterRefresh(PullToRefreshView view) {
            new Thread(){
                public void run() {
                    try {
                        //to do network task
                        Thread.sleep(1000);
                        mHandler.sendEmptyMessage(MSG_WHAT_MORE);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    
        @Override
        public void onHeaderRefresh(PullToRefreshView view) {
            new Thread() {
                public void run() {
                    try {
                        //to do network task
                        Thread.sleep(1000);
                        mHandler.sendEmptyMessage(MSG_WHAT_REFRESH);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
        
        private Handler mHandler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case MSG_WHAT_MORE:
                    mPullToRefreshView.onFooterRefreshComplete();
                    addItemsToContainer(currentDownloadList);
                    break;
                case MSG_WHAT_REFRESH:
                    mPullToRefreshView.onHeaderRefreshComplete();
                    refreshContainer(currentDownloadList);
                    break;
                }
            }
            
        };
        
        /**
         * initialize the static URLs just for test.
         */
        private void initData() {
            currentDownloadList.add("http://g.hiphotos.baidu.com/album/w%3D230/sign=a94d197c8435e5dd902ca2dc46c7a7f5/838ba61ea8d3fd1fa7bb5b14314e251f95ca5f6a.jpg");
            currentDownloadList.add("http://e.hiphotos.baidu.com/album/w%3D230/sign=af9a677a024f78f0800b9df049300a83/4d086e061d950a7b567fb7ea0bd162d9f2d3c952.jpg");
            currentDownloadList.add("http://e.hiphotos.baidu.com/album/w%3D230/sign=9c6ef885023b5bb5bed727fd06d3d523/b90e7bec54e736d19b7475269a504fc2d56269bd.jpg");
            currentDownloadList.add("http://a.hiphotos.baidu.com/album/w%3D230/sign=b540585248540923aa69647da259d1dc/c9fcc3cec3fdfc03aab445c9d53f8794a5c226f6.jpg");
            currentDownloadList.add("http://b.hiphotos.baidu.com/album/w%3D230/sign=d0765733622762d0803ea3bc90ed0849/359b033b5bb5c9ea6c54ebf3d439b6003af3b37f.jpg");
            currentDownloadList.add("http://g.hiphotos.baidu.com/album/w%3D230/sign=e6fc366555e736d158138b0bab514ffc/cdbf6c81800a19d8e2ccfcbc32fa828ba71e46bf.jpg");
            currentDownloadList.add("http://e.hiphotos.baidu.com/album/w%3D230/sign=e640c2ea1ad5ad6eaaf963e9b1cb39a3/42a98226cffc1e17bed9751f4b90f603738de9be.jpg");
            currentDownloadList.add("http://f.hiphotos.baidu.com/album/w%3D230/sign=6cc9612a5882b2b7a79f3ec701accb0a/2cf5e0fe9925bc3191edf8b65fdf8db1cb137068.jpg");
            currentDownloadList.add("http://f.hiphotos.baidu.com/album/w%3D230/sign=e0331d0d72f082022d92963c7bfafb8a/9f2f070828381f30a45c7487a8014c086e06f053.jpg");
        }
    
    }

    这里就是主要的算法以及功能了.这里用到了开源框架volley加载处理图片.嘿嘿,不多说了,到时候直接上源码.希望各位朋友多多指教!

    下载地址:https://files.cnblogs.com/yinweiliang/ToggleButton.rar

  • 相关阅读:
    Prometheus对标签的处理
    Promethueus常用函数
    jenkins容器化docker-compose
    k8s常用命令
    k8s网络笔记
    动态更新已经存在配置
    prometheus远程写调优参数说明
    IndiaHacks 2016
    Codeforces Round #344 (Div. 2) Messager KMP的应用
    HDU1711 KMP的应用
  • 原文地址:https://www.cnblogs.com/yinweiliang/p/3753194.html
Copyright © 2011-2022 走看看