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

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


百度壁纸系列

仿百度壁纸客户端(一)——主框架搭建,自定义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
     */
    @Override
    protected 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() {
        @Override
        public 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 {

        @Override
        public 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(){
      @Override
      public void handleMessage(Message msg) {
          switch (msg.what){
              case 100:
                    adapter.notifyDataSetChanged();
                  loadview.dataFinish();
                  break;
          }
          super.handleMessage(msg);
      }
  };

    @Override
    public 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();
    }

    @Override
    public 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 {
        //加载数据
        @Override
        public void load() {
            new Thread(new Runnable() {
                @Override
                public void run() {

                    try {
                        //睡一下
                        Thread.sleep(2000);
                        initGridData();
                        handle.sendEmptyMessage(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

        }

        //刷新数据
        @Override
        public 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);
        }

        @Override
        public int getCount() {
            return data.size();
        }

        @Override
        public Object getItem(int position) {
            return data.get(position);
        }

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

        @Override
        public 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
从程序员的视角,看计算机系统! 本书适用于那些想要写出更快、更可靠程序的程序员。通过掌握程序是如何映射到系统上,以及程序是如何执行的,读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的。粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境。而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为计算机科学研究者和工程师的工作有进一步的帮助。它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。 本书的主要论题包括:数据表示、C程序的机器级表示、处理器结构,程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的。例如,在讲述数据表示时,本书说明了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数,但是这种表示方法是有限制的,程序员必须了解。在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的。在讨论网络互连时,本书描述了并发服务器如何能有效地处理来自多个客户端的请求。 本书基于Intel兼容(IA32)机器,在Unix或者相关的操作系统(例如,Linux)上执行C程序。虽然书中包括了一些帮助读者将Java转化成C的提示,但是还是要求读者对C或者C++有一定的了解。 您可以通过本书的Web网站www.csapp.cs.cmu.edu获得完整的资料,包括实验和作业,授课笔记和代码示例。 本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一,著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作。作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖。   本书共分十三章,分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和动态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念,并向读者展示这些概念是如何实际地影响应用程序的正确性、性能和实用性。与其他主要针对系统构造人员的系统类书籍不同,这本书是写给程序员的,是从程序员的角度来描述的。本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径,这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念,让读者很清楚地在脑海中构造一个层次型的计算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示),到流水线指令的构成,到虚拟存储器,到编译系统,到动态加载库,到最后的用户应用。   本书提供了大量的例子和练习及部分答案。尤其值得一提的是,对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘某人程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值