仿百度壁纸客户端(四)——自定义上拉加载实现精选壁纸墙


百度壁纸系列

仿百度壁纸客户端(一)——主框架搭建,自定义Tab + ViewPager + Fragment

仿百度壁纸客户端(二)——主页自定义ViewPager广告定时轮播图

仿百度壁纸客户端(三)——首页单向,双向事件冲突处理,壁纸列表的实现

仿百度壁纸客户端(四)——自定义上拉加载实现精选壁纸墙

仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字

仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化


主页说完了,我们来实现第二个页面吧,第二个精选其实就是一个壁纸墙,百度壁纸本身也没做下拉刷新,所以我们只考虑上拉加载,其实实现不负责,壁纸墙还是用主页的自定义GridView,但是这里我们还得重写ScroolView来监听他是否滑动到底部,这样吧,我们先来看一下百度壁纸的效果吧:

我们先来自定义一个ScrollView监听滑动到底部

PullScrollView

package com.lgl.baiduwallpaper.view;import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;/*** 刷新的View,主要是监听是否滑动到顶部或者底部* Created by lgl on 16/4/6.*/
public class PullScrollView extends ScrollView {private static  final  String LOAD = "load";public IcallBack icallBack = null;//构造方法public PullScrollView(Context context, AttributeSet attrs) {super(context, attrs);}/*** 手指滑动,不停的调用* @param l* @param t* @param oldl* @param oldt*/@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {check();super.onScrollChanged(l, t, oldl, oldt);}/*** 上下监听*/private void check() {//判断是否上拉到底部if (getChildAt(0) != null && getChildAt(0).getMeasuredHeight() <= getScrollY() + getHeight()) {if(LoadReshView.getBottomOrTop()){return;}//回调到下一个页面icallBack.click(LOAD);}}/*** 定义一个底部的接口*/public interface IcallBack {public void click(String bottom);}/*** 定义一个方法*/public void setIcallBack(IcallBack icallBack) {this.icallBack = icallBack;}
}

这里我们就可以写一个组合控件了,把具体功能给全部实现的控件了,我们先定义这样的一个布局

pull_load.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.lgl.baiduwallpaper.view.PullScrollView
        android:id="@+id/pull_scroll"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
            android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.lgl.baiduwallpaper.view.DisGridView
                android:horizontalSpacing="10dp"android:verticalSpacing="10dp"android:numColumns="3"android:id="@+id/mGridView"android:layout_width="match_parent"android:layout_height="match_parent" /><RelativeLayout
                android:layout_width="match_parent"android:layout_height="50dp"><LinearLayout
                    android:id="@+id/linearLayout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:orientation="horizontal"><!--加载更多的进度--><ProgressBar
                        android:id="@+id/proBar"style="?android:attr/progressBarStyleSmall"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextView
                        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="正在加载..." /></LinearLayout></RelativeLayout></LinearLayout></com.lgl.baiduwallpaper.view.PullScrollView>
</LinearLayout>

那我们就来实现了,我们自定义一个容器

LoadReshView

package com.lgl.baiduwallpaper.view;import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;import com.lgl.baiduwallpaper.R;/*** 上啦 刷新* Created by lgl on 16/4/6.*/
public class LoadReshView extends LinearLayout {private static final String LOAD = "load";private static final int LOADDATA = 1;private static final int REFREAH = 2;//监听底部private PullScrollView pullScrollView;//数据表格private DisGridView mGridView;//下拉显示布局private LinearLayout linearLayout;public pullCallBack pull = null;//没有显示底部布局private static boolean isShow = false;/*** 子线程*/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case LOADDATA:isBottomShow();isShow = true;break;case REFREAH:isBottomSClose();isShow = false;break;}super.handleMessage(msg);}};/*** 构造方法** @param context* @param attrs*/public LoadReshView(Context context, AttributeSet attrs) {super(context, attrs);initView();}/*** 初始化*/private void initView() {//加载布局文件LayoutInflater inflater = LayoutInflater.from(getContext());View view = inflater.inflate(R.layout.pull_load, this);findView(view);setCallBack();}/*** 实现回调接口*/private void setCallBack() {pullScrollView.setIcallBack(new MyIcallback());}/*** 实现接口*/private class MyIcallback implements PullScrollView.IcallBack {@Overridepublic void click(String bottom) {//如果监听到最底部if (bottom.equals(LOAD)) {pull.load();//显示handler.sendEmptyMessage(LOADDATA);} else {pull.reFresh();}}}/*** 加载数据的接口*/public interface pullCallBack {//加載public void load();//刷新public void reFresh();}/*** 初始化控件** @param view*/private void findView(View view) {pullScrollView = (PullScrollView) view.findViewById(R.id.pull_scroll);mGridView = (DisGridView) view.findViewById(R.id.mGridView);linearLayout = (LinearLayout) view.findViewById(R.id.linearLayout);}public void setpullCallBack(pullCallBack pull) {this.pull = pull;}/*** 判斷是否显示操作** @return*/public static boolean getBottomOrTop() {return isShow;}/*** 显示底部*/public void isBottomShow() {linearLayout.setVisibility(View.VISIBLE);}public void isBottomSClose() {linearLayout.setVisibility(View.GONE);}/*** 数据加载完成*/public void dataFinish() {handler.sendEmptyMessage(REFREAH);}/*** 返回** @return*/public PullScrollView getpullScrollView() {return pullScrollView;}/*** 返回** @return*/public DisGridView getGridView() {return mGridView;}}

这里我们就可以去实现这个功能了,GridView需要一个adapter,那就要一个item,也就是一个imageview(实际项目中,是使用smartimageview)的

sele_item.xml

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

最后,我们就可以来实现精选页SelectFragment的逻辑了

SelectFragment

package com.lgl.baiduwallpaper.fragment;import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;import com.lgl.baiduwallpaper.R;
import com.lgl.baiduwallpaper.view.DisGridView;
import com.lgl.baiduwallpaper.view.LoadReshView;import java.util.ArrayList;/*** 精选* Created by lgl on 16/3/31.*/
public class SelectFragment extends Fragment {private LoadReshView loadview;private DisGridView myGridView;private ArrayList<Integer> data = new ArrayList<Integer>();private myAdapter adapter;private Handler handle= new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case 100:adapter.notifyDataSetChanged();loadview.dataFinish();break;}super.handleMessage(msg);}};@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.select_fragment, container, false);findView(view);return view;}/*** 初始化控件** @param view*/private void findView(View view) {loadview = (LoadReshView) view.findViewById(R.id.myloadview);
//        myGridView = (DisGridView) view.findViewById(R.id.mGridView);myGridView = loadview.getGridView();}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);init();}/*** 初始化数据*/private void init() {loadview.setpullCallBack(new PullClick());initGridData();adapter = new myAdapter(getActivity());myGridView.setAdapter(adapter);}/*** GridView数据*/private void initGridData() {for (int i = 0; i < 10; i++) {//添加数据data.add(R.drawable.nice);}}private class PullClick implements LoadReshView.pullCallBack {//加载数据@Overridepublic void load() {new Thread(new Runnable() {@Overridepublic void run() {try {//睡一下Thread.sleep(2000);initGridData();handle.sendEmptyMessage(100);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}//刷新数据@Overridepublic void reFresh() {}}/*** GridView的Adapter*/private class myAdapter extends BaseAdapter {private Context mContext;private LayoutInflater inflater;public myAdapter(Context mContext) {this.mContext = mContext;inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder;if (convertView == null) {convertView = inflater.inflate(R.layout.sele_item, null);viewHolder = new ViewHolder();viewHolder.imgs = (ImageView) convertView.findViewById(R.id.smartimg);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}//设置数据convertView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,300));viewHolder.imgs.setBackgroundResource(R.drawable.nice);return convertView;}}static class ViewHolder {ImageView imgs;}
}

最后的运行效果

这个虽然有些粗糙,但是我们主要还是实现逻辑为主,UI部分大家自行调整哈

Demo下载:http://download.csdn.net/detail/qq_26787115/9484197

仿百度壁纸客户端(四)——自定义上拉加载实现精选壁纸墙相关推荐

  1. IOS 类似抖音下拉刷新与自定义上拉加载

    IOS 类似抖音下拉刷新与自定义上拉加载 最近UICollectionView中使用了pageEnabled,MJRresh直接使用时出现偏移.这里就暂时考虑简单的做法. 首先考虑在UICollect ...

  2. uniapp 自定义上拉加载下拉刷新组件

    介绍 该组件是结合uview框架写的,主要结合了里面的u-loadmore组件,可配置下拉刷新加载圈的颜色及背景色,暂无数据时的图等,突出的特点就是通过设置组件的高度,适配刘海屏iPhone,且支持嵌 ...

  3. 微信小程序下拉刷新/上拉加载组件

    简介 一款基于官方组件scroll-view进行封装的支持上拉加载下拉刷新的微信小程序组件,需要基础库2.10.1及以上, 项目地址:github 预览 功能 下拉刷新 上拉加载 支持自定义下拉样式 ...

  4. 小程序 onReachBottom 上拉加载事件失效

    微信自带的下拉刷新上拉加载需要在 .json 文件里打开 "enablePullDownRefresh": true 在 .js 文件中分别对应两个事件 /*** 页面相关事件处理 ...

  5. iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码

    iOS精选源码 Swift-图片画框标注 Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用) iOS tabbar上的提示框 Swift图片浏览器,经过一年多维护,已基本稳定 图片滤镜 ...

  6. iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码...

    iOS精选源码 Swift-图片画框标注 Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用) iOS tabbar上的提示框 Swift图片浏览器,经过一年多维护,已基本稳定 图片滤镜 ...

  7. android中上拉下滑布局,3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~...

    本文主要针对开发新手,手写实现一个最简单Android自定义listview下拉刷新和上拉加载demo. 不喜可喷,欢迎大佬留言指点. 效果图 一:编写需要在ListView中增加头加载的布局文件,与 ...

  8. BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多

    上拉加载 上拉加载无需监听滑动事件,可自定义加载布局,显示异常提示,自定义异常提示. 此篇文章为BaseRecyclerViewAdapterHelper源码解读第四篇,开源库地址,如果没有看过之前3 ...

  9. vue 仿B站下拉刷新上拉加载

    vue 仿B站下拉刷新上拉加载 功能大部分都是跟B站一样的,还是有一些瑕疵和小bug的,φ(>ω<*) 先上demo连接和gitHub项目地址吧 demo展示 https://github ...

最新文章

  1. 前端面试之Vue向技巧总结
  2. SingleCellExperiment类使用
  3. 现代化机器学习工具,助数据科学家开展更多工程或业务功能
  4. 安卓怎么显示res文件夹中的html_android中自定义WebView显示网页或本地html文件 | 学步园...
  5. C/C++拾遗(二)
  6. 毕业设计——第三章 开发方法及系统实现(5)
  7. Java加密与解密的艺术~MD算法实现
  8. 大数据之Hive教程
  9. Axure 经典实例高保真原型下载(Axure高保真酒店管理交互组件连锁酒店erp酒店企业web端后台管理财务管理会员管理网销管理报表管理))
  10. aix oracle调整逻辑卷的大小,AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume(示例代码)...
  11. 操作系统-页式虚拟存储器管理系统设计
  12. 项目:jSon和Ajax登录功能
  13. 刘莹等:干旱对灌溉和雨养农田生态系统生产力的影响对比分析 【关于底图的考虑】
  14. 【项目】区块链在电商领域中的应用-草莓糖(CMT)(二)
  15. 猫(Modem)和路由器有什么区别?
  16. wireshark使用说明
  17. 爬虫技术(02)神箭手爬虫实时API
  18. 邮箱如何群发邮件,公司邮件群发教程
  19. 数据结构实验(严蔚敏版)----栈与队列
  20. 【博主推荐】html好看的邀请函(附源码)

热门文章

  1. 等级水准测量规范整理
  2. 中望CAD调用lisp在哪_中望CAD加载LISP程序(图文教程)
  3. 用声网 Android UIKit 为实时视频通话应用添加自定义背景丨声网 SDK 教程
  4. Attention-LSTM模型的python实现
  5. 共享格子售货机方案开发详情
  6. 论文中遇到的arg是啥意思?
  7. Linux之traceroute命令
  8. 小米路由hd php,小米路由器HD,附和R7800使用的对比感受
  9. 服务器回收iis网站服务资源,四两拨千斤 如何让IIS服务器运行更高效
  10. public,private,protected修饰符作用范围