热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android下拉刷新上拉更多瀑布流(附源码)

关于瀑布流,我相信有很多朋友经常会用到.但是呢我们经常也会遇到这个问题,比如瀑布流不能下拉刷新,或者上拉更多,有的是一个简单的touch事件监听上拉加载更多,但是很显然,这样的功能

关于瀑布流,我相信有很多朋友经常会用到.但是呢我们经常也会遇到这个问题,比如瀑布流不能下拉刷新,或者上拉更多,有的是一个简单的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 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 currentDownloadList = new ArrayList();/*** the total list of images's URLs*/private List imageUrlsList = new ArrayList();@Overrideprotected 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();for (int i = 0; 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 imgNameList*/public void refreshContainer(List imgNameList) {int columnNumber = 0;imageUrlsList.clear();imageUrlsList.addAll(imgNameList);//remove all children imagesfor (int index = 0; index ) {containerList.get(index).removeAllViews();}for (int index = 0; index ) {//check the current column index by the position of the listcolumnNumber = index % column_count; addImage(imageUrlsList.get(index), columnNumber);}}/*** add items to waterfall* @param imgNameList*/public void addItemsToContainer(List imgNameList) {int columnNumber = 0;int usualListLength = imageUrlsList.size();imageUrlsList.addAll(imgNameList);for (int index = usualListLength; index ) {//check the current column index by the position of the listcolumnNumber = 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);}@Overridepublic void onFooterRefresh(PullToRefreshView view) {new Thread(){public void run() {try {//to do network taskThread.sleep(1000);mHandler.sendEmptyMessage(MSG_WHAT_MORE);} catch (Exception e) {e.printStackTrace();}}}.start();}@Overridepublic void onHeaderRefresh(PullToRefreshView view) {new Thread() {public void run() {try {//to do network taskThread.sleep(1000);mHandler.sendEmptyMessage(MSG_WHAT_REFRESH);} catch (Exception e) {e.printStackTrace();}}}.start();}private Handler mHandler = new Handler() {@Overridepublic 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加载处理图片.嘿嘿,不多说了,到时候直接上源码.希望各位朋友多多指教!

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

 


转载于:https://www.cnblogs.com/yinweiliang/p/3753194.html


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
橡树NO洋_640
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有