• android之Volley实现瀑布流


    1.首先我们来看下主布局文件activity_main.xml。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
        <com.chen.photodemo.MyScrollView
            android:id="@+id/scrollView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
              >
            <LinearLayout android:id="@+id/mianContainer"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="horizontal">
            </LinearLayout>
        </com.chen.photodemo.MyScrollView>
    </RelativeLayout>

    再看看自己定义的一个imageview布局文件line_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >
        <ImageView android:id="@+id/itemImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>

    2.接下来自己定义的一个类来实现Scrollview类

    package com.chen.photodemo;
    
    import android.content.Context;
    import android.os.Handler;
    import android.os.Message;
    import android.util.AttributeSet;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.ScrollView;
    
    /**
     * 
     * @author jianrong.zheng
     *
     */
    public class MyScrollView extends ScrollView implements OnTouchListener{
        private ScrollCallBack scrollCallBack;
        private View view;
        private Handler refrshHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                case 1:
                    //view.getMeasuredHeight()代表LinearLayout需要的高度
                    //getScrollY()代表Y轴的上边线 +getHeight()固定不变的屏幕高度,如果大于原有LinearLayout高度则证明是向上划
    //                System.out.println("===getScrollY()"+getScrollY());
    //                System.out.println("===getHeight()"+getHeight());
                    if (view.getMeasuredHeight() <= getScrollY() + getHeight()) {  
                        if (scrollCallBack != null) {  
                            scrollCallBack.onBottom();  
                        }  
    
                    } else if (getScrollY() == 0) {  
                        if (scrollCallBack != null) {  
                            scrollCallBack.onTop();  
                        }  
                    } else {  
                        if (scrollCallBack != null) {  
                            scrollCallBack.onScroll();  
                        }  
                    }  
                    break;
    
                default:
                    break;
                }
            }
            
        };
        
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            System.out.println();
            return super.dispatchKeyEvent(event);
        }
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return super.onTouchEvent(event);
            case MotionEvent.ACTION_UP:
                  if (view != null && scrollCallBack != null) {  
                      refrshHandler.sendMessageDelayed(refrshHandler.obtainMessage(1), 200);  
                  }  
                return true;
            default:
                break;
            }
            return super.onTouchEvent(event);
        }
        
        public int computeVerticalScrollRange() {
            return super.computeVerticalScrollRange();
        }
        
        public int computeVerticalScrollOffset() {  
            return super.computeVerticalScrollOffset();  
        }  
        
        
        public void setScrollCallBack(ScrollCallBack scrollCallBack) {  
            this.scrollCallBack = scrollCallBack; 
            this.view = getChildAt(0); //为了获得它的MeasuredHeight,然后和滚动条的ScrollY+getHeight作比较。
            this.setOnTouchListener(this);
        }  
        
        /**
         * 
         *接口回调
         */
        public interface ScrollCallBack {
            public void onTop();
            public void onBottom();
            public void onScroll();
        }
    }

    3.接下来再看自己要往list放入你想放的图片的的url

    package com.chen.photodemo;
    
    /**
     * 图片
     * @author jianrong.zheng
     */
    public class ImageConst {
        public static String[] urls;
        static{
            urls = new String[]{
                "http://a.hiphotos.baidu.com/pic/w%3D230/sign=bf59456cc9fcc3ceb4c0ce30a244d6b7/4afbfbedab64034f80b90b48aec379310a551d0c.jpg",
                "http://d.hiphotos.baidu.com/pic/w%3D230/sign=e92db34bc995d143da76e32043f18296/8601a18b87d6277f35a56d7029381f30e824fcc7.jpg",
                "http://a.hiphotos.baidu.com/pic/w%3D230/sign=f71ba7639c16fdfad86cc1ed848e8cea/241f95cad1c8a78699e316466609c93d71cf50a8.jpg",
                "http://f.hiphotos.baidu.com/pic/w%3D230/sign=dbe3e3fab8014a90813e41be99763971/63d0f703918fa0eccd0e3845279759ee3c6ddba9.jpg",
                "http://d.hiphotos.baidu.com/pic/w%3D230/sign=bb37f35dbd315c6043956cecbdb0cbe6/d000baa1cd11728b1cd9d36ac9fcc3cec2fd2c85.jpg",
                "http://c.hiphotos.baidu.com/pic/w%3D230/sign=59a8fcd9f91986184147e8877aec2e69/3c6d55fbb2fb4316879103c221a4462308f7d3f8.jpg",
                "http://e.hiphotos.baidu.com/pic/w%3D230/sign=20f4fb5b96dda144da096bb182b6d009/95eef01f3a292df5ccddf35dbd315c6034a8735f.jpg",
                "http://e.hiphotos.baidu.com/pic/w%3D230/sign=dc101ae5bba1cd1105b675238910c8b0/d01373f082025aaf80c3801efaedab64024f1a75.jpg",
                "http://f.hiphotos.baidu.com/pic/w%3D230/sign=4e07a985fd039245a1b5e60cb795a4a8/024f78f0f736afc3f4f8602db219ebc4b6451285.jpg",
                "http://e.hiphotos.baidu.com/pic/w%3D230/sign=1522ba04b151f819f1250449eab44a76/58ee3d6d55fbb2fb6f26643d4e4a20a44623dc8b.jpg",
                "http://d.hiphotos.baidu.com/pic/w%3D230/sign=348b736477c6a7efb926af25cdfbafe9/4034970a304e251f46503243a686c9177e3e53e2.jpg",
                "http://b.hiphotos.baidu.com/pic/w%3D230/sign=60e9d1767aec54e741ec1d1d89399bfd/d058ccbf6c81800a580ed546b03533fa838b478a.jpg",
                "http://b.hiphotos.baidu.com/pic/w%3D230/sign=3f09e4c9ca1349547e1eef67664f92dd/b812c8fcc3cec3fd9dd5fb3dd788d43f8694278a.jpg",
                "http://b.hiphotos.baidu.com/pic/w%3D230/sign=3f09e4c9ca1349547e1eef67664f92dd/b812c8fcc3cec3fd9dd5fb3dd788d43f8694278a.jpg",
                "http://e.hiphotos.baidu.com/pic/w%3D230/sign=f95c1f21b3b7d0a27bc9039efbee760d/e1fe9925bc315c6060c0187c8cb1cb13485477cf.jpg",
                "http://f.hiphotos.baidu.com/pic/w%3D230/sign=3497a62dc8177f3e1034fb0e40ce3bb9/7a899e510fb30f24a7f8d898c995d143ac4b03ce.jpg",
                "http://a.hiphotos.baidu.com/pic/w%3D230/sign=f61a1f6efcfaaf5184e386bcbc5494ed/94cad1c8a786c917473fe571c83d70cf3bc757bd.jpg",
                "http://f.hiphotos.baidu.com/pic/w%3D230/sign=55b651b1279759ee4a5067c882fa434e/b7003af33a87e9506866c6d011385343fbf2b41c.jpg",
                "http://e.hiphotos.baidu.com/pic/w%3D230/sign=3a06cb97cf1b9d168ac79d62c3dfb4eb/314e251f95cad1c8eb46a56f7e3e6709c83d51fc.jpg",
                "http://g.hiphotos.baidu.com/pic/w%3D230/sign=ea85ce6bf11f3a295ac8d2cda924bce3/c83d70cf3bc79f3d9e0d8b85bba1cd11738b2992.jpg",
                "http://h.hiphotos.baidu.com/pic/w%3D230/sign=8b92084b359b033b2c88fbd925cf3620/203fb80e7bec54e769690f51b8389b504ec26af3.jpg",
                "http://b.hiphotos.baidu.com/pic/w%3D230/sign=60e61a8883025aafd33279c8cbecab8d/060828381f30e924096cc0794d086e061c95f7aa.jpg",
                "http://a.hiphotos.baidu.com/pic/w%3D230/sign=e869d0a6d52a283443a631086bb4c92e/00e93901213fb80ef3dca16c37d12f2eb9389478.jpg",
                "http://e.hiphotos.baidu.com/pic/w%3D230/sign=b9aae94c0ff41bd5da53eff761db81a0/b64543a98226cffcdaa3b1d5b8014a90f703eac8.jpg",
                "http://d.hiphotos.baidu.com/pic/w%3D230/sign=3bde0aab08f79052ef1f403d3cf2d738/9213b07eca80653817adddab96dda144ac3482c6.jpg",
                "http://b.hiphotos.baidu.com/pic/w%3D230/sign=639f5a60a9d3fd1f3609a539004f25ce/b7fd5266d01609244a0c6b55d50735fae6cd3457.jpg"
            };
        }
    }

    4.最后我们来看下activity中是如何实现的。

    package com.chen.photodemo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.Config;
    import android.graphics.Point;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.Display;
    import android.view.Menu;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.Response.Listener;
    import com.android.volley.toolbox.ImageRequest;
    import com.android.volley.toolbox.Volley;
    /**
     * 
     * @author jianrong.zheng
     *
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    public class MainActivity extends Activity{
        private static final int column = 3;//3列
        private static final int pageCount = 12; //每页加载个数
        private int currentPage = 0; //当前页
        private int columnWidth = 0;//列宽
        private LinearLayout mianContainer;//主容器
        private RequestQueue queue;
        private List<LinearLayout> columnLayouts = new ArrayList<LinearLayout>();
        @SuppressWarnings("deprecation")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mianContainer = (LinearLayout) findViewById(R.id.mianContainer);
            queue = Volley.newRequestQueue(this);
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width = size.x;
            columnWidth = (width - 4)/ 3 ;//4为中间2条空隙 
            ((MyScrollView)findViewById(R.id.scrollView)).setScrollCallBack(new MyScrollCallBack());
            addColumn();
         
        }
        
        /**
         * 滚动回调
         */
        class MyScrollCallBack implements MyScrollView.ScrollCallBack {
    
            @Override
            public void onTop() {
                
            }
    
            @Override
            public void onBottom() {
                currentPage++;
                addImageView2Column();
            }
    
            @Override
            public void onScroll() {
                
            }
            
        }
    
        /**
         * 构造列
         */
        private void addColumn() {
            for(int i = 0;i < column;i++) {//构造列
                LinearLayout columnLayout = new LinearLayout(this);
                columnLayout.setLayoutParams(new LayoutParams(columnWidth, LayoutParams.MATCH_PARENT));
                columnLayout.setOrientation(LinearLayout.VERTICAL);
                columnLayouts.add(columnLayout);
                mianContainer.addView(columnLayout);
            }
            addImageView2Column();
        }
        
        /**
         * 构造完后开始加入imageView到列中
         */
        private void addImageView2Column() {
            //网上抄的方法,目前没发现什么BUG
            int columnIndex = 0;
            int imageCount = ImageConst.urls.length;
            for(int i = currentPage * pageCount;i< (currentPage +1)*pageCount && i < imageCount;i++) {
                columnIndex = columnIndex >= column ? columnIndex = 0 : columnIndex;
                ImageView itemImage = new ImageView(this);
                itemImage.setLayoutParams(new LayoutParams(columnWidth,LayoutParams.WRAP_CONTENT));
                itemImage.setPadding(2, 2, 2, 2);
                columnLayouts.get(columnIndex).addView(itemImage);
                downloadImage(itemImage,i);
                columnIndex++;
            }
        }
    
        
        /**
         * 下载图片,自带缓存
         * @param itemImage
         * @param index
         */
        private void downloadImage(final ImageView itemImage, int index) {
            //columnWidth这个是设置下载图片的maxWidth,0代表不限定
            ImageRequest request = new ImageRequest(ImageConst.urls[index], new Listener<Bitmap>() {
                @Override
                public void onResponse(Bitmap response) {
                    itemImage.setImageBitmap(response);
                }
            }, columnWidth, 0, Config.RGB_565, null);
            request.setShouldCache(true);//设置缓存 缓存路径看我以前的帖子
            queue.add(request);
    
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    }

    如果大家有更好地方法,希望大家多多推荐,相互学习。

    来看看效果图吧!

  • 相关阅读:
    关于Mysql几周的整理文档
    压力开关
    【团队】汇总
    2017级面向对象程序设计——团队作业1
    东风吹十里,风华一笔得。
    【团队】实验品
    【2017级面向对象程序设计】作业四
    【C#】C#学习笔记_1
    【2017级面向对象程序设计】作业三
    【2017级面向对象程序设计】作业二
  • 原文地址:https://www.cnblogs.com/jianrong-zheng/p/3449629.html
Copyright © 2020-2023  润新知