Android中自定义ListView实现上拉加载更多和下拉刷新

ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能。这里我就简单记录一下实现过程。

实现这个功能的方法不止一个,GitHub上有一些开源库可以使用,但是本着学习的精神,我做的是使用自定义ListView实现这个功能。

思路:谷歌提供的ListView是不能提供下拉刷新和下拉加载的,所以我们就需要重写ListView。在ListView的头部和尾部加上我们的布局文件(progressbar)。

先说上拉加载更多实现原理:

首先先写一个底部布局的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:id="@+id/foot_load"
     android:padding="5dp"
     android:gravity="center">
     <ProgressBar
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         style="?android:attr/progressBarStyle"
         />
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="加载中。。。。"
         />
 </LinearLayout>

</LinearLayout>

    写一个自定义ListView继承自ListView实现它的三个构造方法,这里必须实现三个构造方法,不实现的话就无法显示ListView.并且在每个构造方法中都写一个方法用于初始化相关控件。

public class MyListView extends ListView {
public MyListView(Context context) {
        super(context);
        initView(context);
    }
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }
}

在initView(context)方法中通过LayoutInfalter.from(context).from(你的xml,null);拿到xml。返回一个View对象,ListView中有一个setfootView()方法,使用他可以设置View到ListView的底部,当然做了这两步是完全不够的,我们还需要对这个View做一个交互的操作,当用户滑到底部时这个View显示,数据加载完毕之后这个View消失。

第一步:需要对这个底部footView隐藏:

第一种方式是通过setVisibility(View.GONE)这个方法让这个View不显示。

第二种方式:

       //测量footview的高度,通过measure()传入两个0参数,系统会不认这个0,自动帮我们测量出加在底部View的长度信息
        footview.measure(0,0);
        //拿到高度
        footViewHeight=footview.getMeasuredHeight();
        //隐藏view,让头部显示高度为实际测量高度的负数,实现布局的隐藏
        footview.setPadding(0,-footViewHeight,0,0);

第二部:当滑到底部的时候显示这个footView。这里就要实现下滑监听接口implements AbsListView.OnScrollListener,实现接口的两个方法。

  @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (totaItemCounts==lasstVisible&&scrollState==SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading=true;
               // footview.findViewById(R.id.foot_load).setVisibility(View.VISIBLE);
                footview.setPadding(0,0,0,0);
                //加载数据
                loadListener.onLoad();}
        }

    }
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//最后一个可见item是第一个可见item加上所有可见item(第一个可见item为0)
this.lasstVisible=firstVisibleItem+visibleItemCount;
//所有item为listview的所有item
this.totaItemCounts=totalItemCount; }

那么如何在刷新的时候通知ListView加载数据呢?这里使用一个接口回调的方法在自定义ListView写一个接口,里面写一个更新ListView的方法,让主布局调用这个接口实现这个接口的方法。

 public void setInterface(LoadListener loadListener){
        this.loadListener=loadListener;

    }
    //接口回调
    public interface LoadListener{

        void onLoad();
        
  }
    @Override
    public void onLoad() {
        //设置三秒延迟模仿延时获取数据
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //加载数据
                for (int j=1;j<11;j++){

                    list.add(j);
                }
                //更新 数据
                adapter.notifyDataSetChanged();
                //加载完毕,就是让View隐藏
                listview.loadComplete();

            }
        },3000);
}

好了,这就实现了一个简单的上拉加载功能。

下拉刷新和上拉加载过程差不多,但是有时候,下拉刷新有提示,下拉刷新,松开刷新,正在刷新提示,这又该如何实现呐,这里就需要实现onTouchEvent方法,设置下拉长度匹配刷新数据。同时,设置progrebar的可见状态。

   @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                yload=(int)ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveY=(int)ev.getY();
                int paddingY=-headViewHeight+(moveY-yload)/2;

                    if (paddingY<0){
                        updateInfo.setText("下拉刷新。。。");
                        progressBar.setVisibility(View.GONE);
                    }
                    if (paddingY>0){
                        updateInfo.setText("松开刷新。。。");
                        progressBar.setVisibility(View.GONE);
                    }

                headview.setPadding(0,paddingY,0,0);

                break;
//            case MotionEvent.ACTION_UP:
//                headview.setPadding(0,0,0,0);
//                updateInfo.setText("正在刷新。。。");
//                progressBar.setVisibility(View.VISIBLE);
//                loadListener.pullLoad();
//
//                break;
        }
        return super.onTouchEvent(ev);
    }

附上完整源码:

main.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.yakir.view.MyListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_view"></com.yakir.view.MyListView>


</RelativeLayout>

main activity:

package com.yakir.demo;

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.widget.ArrayAdapter;

import com.yakir.view.MyListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements MyListView.LoadListener{
    private MyListView listview;
    private List<Integer>list=new ArrayList<>();
    private ArrayAdapter adapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        for (int i=1;i<20;i++){
            list.add(i);
        }
        initView();
        adapter=new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,list);
        listview.setAdapter(adapter);

    }

    private void initView() {
        listview=(MyListView) findViewById(R.id.list_view);
        listview.setInterface(this);
    }

    @Override
    public void onLoad() {
        //设置三秒延迟模仿延时获取数据
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //加载数据
                for (int j=1;j<11;j++){

                    list.add(j);
                }
                //更新 数据
                adapter.notifyDataSetChanged();
                //加载完毕
                listview.loadComplete();

            }
        },3000);


    }

    @Override
    public void pullLoad() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                list.clear();
                for (int i=1;i<20;i++){
                    list.add(i+1);
                }
                adapter.notifyDataSetChanged();
                listview.loadComplete();

            }
        },2000);

    }
}

头布局headview:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/head"
        android:orientation="horizontal"
        android:gravity="center"
        android:padding="5dp">
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="?android:attr/progressBarStyleInverse"
            android:id="@+id/progressbar"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="正在刷新。。。。"
            android:id="@+id/update_info"/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/update_time"
            />

    </LinearLayout>


</LinearLayout>

尾布局footview:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:id="@+id/foot_load"
     android:padding="5dp"
     android:gravity="center">
     <ProgressBar
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         style="?android:attr/progressBarStyle"
         />
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="加载中。。。。"
         />
 </LinearLayout>

</LinearLayout>

自定义ListView:

package com.yakir.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.yakir.demo.R;

import java.text.SimpleDateFormat;

/**
 * 自定义listview实现上拉刷新下拉加载
 * Created by qbqw7 on 2016/7/12.
 */
public class MyListView extends ListView implements AbsListView.OnScrollListener{
    private View footview;
    private View headview;
    private int totaItemCounts;
    private int lasstVisible;
    private int fistVisiable;
    private LoadListener loadListener;
    private int footViewHeight;
    private int headViewHeight;
    private int yload;
    boolean isLoading;
    private TextView updateInfo;
    private TextView updateTime;
    private ProgressBar progressBar;
    public MyListView(Context context) {
        super(context);
        initView(context);
    }
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    private void initView(Context context) {
        //拿到头布局xml
        headview=LayoutInflater.from(context).inflate(R.layout.head_layouyt,null);
        updateInfo=(TextView)headview.findViewById(R.id.update_info);
        updateTime=(TextView)headview.findViewById(R.id.update_time);
        progressBar=(ProgressBar)headview.findViewById(R.id.progressbar);
        updateTime.setText("更新于:"+new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(System.currentTimeMillis()));
        //拿到尾布局xml
        footview=LayoutInflater.from(context).inflate(R.layout.proces_layout,null);
        //测量footview的高度
        footview.measure(0,0);
        //拿到高度
        footViewHeight=footview.getMeasuredHeight();
        //隐藏view
        footview.setPadding(0,-footViewHeight,0,0);
        headview.measure(0,0);
        headViewHeight=headview.getMeasuredHeight();
        headview.setPadding(0,-headViewHeight,0,0);
        //设置不可见
        // footview.findViewById(R.id.foot_load).setVisibility(View.GONE);
        // headview.findViewById(R.id.head).setVisibility(View.GONE);
        //添加到listview底部
        this.addFooterView(footview);
        //添加到listview头部
        this.addHeaderView(headview);
        //设置拉动监听
        this.setOnScrollListener(this);


    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                yload=(int)ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveY=(int)ev.getY();
                int paddingY=-headViewHeight+(moveY-yload)/2;

                    if (paddingY<0){
                        updateInfo.setText("下拉刷新。。。");
                        progressBar.setVisibility(View.GONE);
                    }
                    if (paddingY>0){
                        updateInfo.setText("松开刷新。。。");
                        progressBar.setVisibility(View.GONE);
                    }

                headview.setPadding(0,paddingY,0,0);

                break;
//            case MotionEvent.ACTION_UP:
//                headview.setPadding(0,0,0,0);
//                updateInfo.setText("正在刷新。。。");
//                progressBar.setVisibility(View.VISIBLE);
//                loadListener.pullLoad();
//
//                break;
        }
        return super.onTouchEvent(ev);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (totaItemCounts==lasstVisible&&scrollState==SCROLL_STATE_IDLE) {
            if (!isLoading) {
                isLoading=true;
               // footview.findViewById(R.id.foot_load).setVisibility(View.VISIBLE);
                footview.setPadding(0,0,0,0);
                //加载数据
                loadListener.onLoad();

            }
        }
        if (fistVisiable==0){
            headview.setPadding(0,0,0,0);
            updateInfo.setText("正在刷新。。。");
            progressBar.setVisibility(View.VISIBLE);
            loadListener.pullLoad();
        }
    }



    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.fistVisiable=firstVisibleItem;
        this.lasstVisible=firstVisibleItem+visibleItemCount;
        this.totaItemCounts=totalItemCount;

    }
    //加载完成
    public void loadComplete(){
        isLoading=false;
        //footview.findViewById(R.id.foot_load).setVisibility(View.GONE);
        footview.setPadding(0,-footViewHeight,0,0);
        headview.setPadding(0,-headViewHeight,0,0);


    }
    public void setInterface(LoadListener loadListener){
        this.loadListener=loadListener;

    }
    //接口回调
    public interface LoadListener{

        void onLoad();
        void pullLoad();


    }
}

 

转载于:https://www.cnblogs.com/lovelyYakir/p/5668331.html

自定义Android ListView下拉刷新与上拉加载更多功能实现 下拉刷新(Pull to Refresh)是一种用户界面模式,允许用户通过下拉列表顶部来触发一个刷新动作,通常是用来更新内容或数据。当用户执行下拉操作时,应用会显示一个正在刷新的指示器,表明数据正在重新加载。上拉加载更多(Load More on Pull to End)则是用户滚动至列表底部时触发的加载动作。为了优化性能和用户体验,开发者往往采用分页的方式加载数据,这种方式可以减少一次性加载过多内容所带来的延迟。在移动应用中,自定义刷新头布局是用户体验的关键点之一。 阅读详情

相关推荐

手把手教你用野火FPGA开发板资料包安装ModelSim 10.5se(附破解教程)

本文提供了一份详细的指南,手把手教你为野火FPGA开发板安装和配置ModelSim 10.5se仿真工具。内容涵盖从前期准备、软件安装、许可证激活(学习用途)到环境验证的全过程,并简要介绍了如何与Xilinx Vivado开发套件集成,帮助初学者快速搭建稳定的FPGA仿真环境。

lstm7chronicler的博客 250

Android中ListView下拉刷新、上拉载入更多示例

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 该示例使用的github上的一个开源控件XListView,作者:Maxwin-z,源码地址:https://github.com/Maxwin-z/XListView-Android 测试activity:XL...

孤云博客 8486

Win11/Win10系统下,Proe5.0 M280终极版保姆级安装与激活指南(含SSQ补丁避坑)

本文提供Win11/Win10系统下Pro/E 5.0 M280终极版的详细安装与激活指南,涵盖环境配置、SSQ补丁应用及常见问题解决方案。通过系统调整、分步安装和性能优化,确保软件在现代操作系统上的稳定运行,特别适合机械设计用户参考。

weixin_30895059的博客 444

[Android]ListView下拉刷新,上拉加载更多

package com.bjym.testdemo; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import andro

南瓜饼 779

Codex驱动AEDT完成无线充电仿真——从双线圈建模到三维电磁场动画

本文介绍了一个利用Codex、PyAEDT和Ansys Electronics Desktop 2025 R2实现双线圈无线充电系统自动建模与仿真的案例。通过简化模型(平面线圈+铁氧体磁芯),完成了从参数化建模、电磁场求解到后处理的全流程自动化,获得了耦合系数(k=0.17)、三维电磁场分布及多周期动态可视化效果。研究发现:线圈间距对传输效率影响最大(10-30mm间距时效率从40.2%降至5.57%),横向偏移15mm会使效率下降35%,而磁芯厚度增加带来的效率提升有限(3→7mm仅提高1.67%)。该框

sjjsjjsjjsjjsjj的博客 446

ESP32-CAM图传小车:端边协同的嵌入式视觉系统设计

在物联网边缘智能场景中,嵌入式视觉系统需平衡实时性、算力与成本。其核心在于理解图像采集、硬件编码、低延迟传输与分层计算的基本原理——OV2640等CMOS传感器配合JPEG硬件编码可显著降低主控负载;TCP流式协议比HTTP/RTSP更适配资源受限MCU;而‘计算卸载’架构将OpenCV等重负载移至Android端,使ESP32专注实时控制与传输,既发挥FreeRTOS任务调度优势,又规避了PSRAM带宽与内存瓶颈。该模式广泛适用于教育机器人、智能巡检及DIY视觉终端等场景,本文以WiFi图传坦克小车为载体

weixin_42524864的博客 373

Android开发笔记之ListView下拉刷新和上拉加载

实现下拉刷新和上拉加载的效果,采用第三方架包实现 采用第三方架包,我们需要实现的代码及其简洁 采用第三方架包可以缩短开发周期,项目周期 采用第三方架包,可以更好的维护项目和优化项目性能 我们实现一个简单的下拉刷新和上拉加载功能 1.这里我们用到的知识有json解析(有第三方架包提供) 2下拉刷新,上拉加载 3.L;istView基础知识 4.自定义Adapter

雪舞草狼 1134

Kettle安装与使用

Pentaho Data Integration作为一个端对端的数据集成平台,可以对多种数据源进行抽取(Extraction)、加载(Loading)、数据落湖(Data Lake Injection)、对数据进行各种清洗(Cleasing)、转换(Transformation)、混合(Blending),并支持多维联机分析处理(OLAP)和数据挖掘(Data mining)。勺子(spoon.bat/spoon.sh):是一个图形化的界面,可以让我们用图形化的方式开发转换和作业。

jnrjian的博客 1万+

listview下拉刷新 上拉(滑动分页)加载更多

最 近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多。新浪微博就是使用这种方式的典型。当用户从网络上读取微博的时候,如果一下子全部加载用户未读的微博这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容。这时候,我们就需要用到另一个功能,那就是listview的分页了,其实这个分...

angchanghui2104的博客 405

物理学建模及仿真平台Chrono安装

Chrono是一个基于物理学的建模和仿真基础设施,它是在C++中实现的独立于平台的开源设计。一个projectchrono库可以嵌入到一个软件项目中,例如在可变形地形上运行的轮式和履带式车辆、机器人、机械电子系统、顺应性机构和流体固体相互作用现象。系统可以由刚性和柔性/顺应性部件组成,并带有约束、电机和接触;部件可以具有三维形状,以便进行碰撞检测。然而安装还是出现了一些问题,所以在此总结。已经装好visual studio。

Already8888的博客 6501

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 256

Android--listview下拉刷新,上拉加载

ListView的下拉刷新+上拉加载 1、XListView git地址:https://github.com/Maxwin-z/XListView-Android 注意: 1、已停止维护,不推荐,推荐 android-pulltorefresh 2、XListView因为添加了Header,会导致存储的数据+1,所以赋值时需要position-1。补充:当去掉Heade

Navan 1016

精度0.01%决定续航多20km|新能源汽车研发测试:功率分析仪到底有多硬核?

新能源汽车测试、功率分析仪、电驱系统、效率MAP、谐波THD、GB/T18488、CLTC工况、三电测试、台架标定、能量流分析。中的核心作用,用公式、思维导图、实战金句与避坑指南,帮研发测试人员把准数据、提效率、降返工,看完就能落地用。点击关注,进公众号主页查看历史文章,**台架接线图、效率MAP模板、GB/T18488测试清单等。优化弱磁/调制策略,高效区占比提升5%,CLTC续航直接+8~20km。同样工况,两次数据差0.8%,报告根本没法交。结果:数据飘、定位慢、反复返工、认证不过。

优快云-新能源汽车研发测试专业博主 170

ListView下拉刷新,上拉自动加载更多

原文地址:http://blog.youkuaiyun.com/limb99/article/details/18901513

4万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

自定义listview实现上拉加载下拉刷新

Android内自带的listview没有上拉加载下拉刷新的功能,可是在正常的开发过程中这一点是必不可少的。 首先是自定义listview,就是定义一个继承listview的类 package com.example.handerview; import java.text.SimpleDateFormat; import android.content.Context; import a

yangliu_csdn的博客 752

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android最新上拉加载,下拉刷新

开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,之前大家最常用的应该是pull to refresh或它的变种版吧,google官方在最新的Android.support.v4包中增加了一个新类SwipeRefreshLayout,地址 这个类的作用就是提供官方的下拉刷新,并且效果相当不错,而上拉加载更多则用我们自定义的listview,也是相当简单。 下拉刷新

专注移动开发 590

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 自定义Listview下拉刷新上拉加载

在android开发中,刷新,加载已经是比较常见的操作,项目中使用的加载控件不知道是哪位大神写的,觉得还挺好用的, 之前一直想找机会好好学学自定义刷新加载控件,各种原因加上自己懒也没有付诸行动,最近写新项目又用到刷新加载,又把大神的控件拿来用,还顺便修复了一个bug(哈哈,有点小窃喜。。)。效果图大致就是这样: 大致思路: 自定义listview ,添加listview header作为下拉

yuxuehandong的博客 423

android UI进阶之实现listview的下拉刷新和加载

android UI进阶之实现listview的下拉加载 关于listview的操作五花八门,有下拉刷新,分级显示,分页列表,逐页加载等,以后会陆续和大家分享这些技术,今天讲下下拉加载这个功能的实现。 最初的下拉加载应该是ios上的效果,现在很多应用如新浪微博等都加入了这个操作。即下拉listview刷新列表,这无疑是一个非常友好的操作。今天就和大家分享下这个操作的实现。

逍遥飞鹤的专栏 2555

自定义ListView下拉刷新上拉加载更多

自定义ListView下拉刷新上拉加载更多

leveretz的博客 630

自定义listView 的下拉刷新上拉加载

前两天看了下自定义view的博客,虽说博客写的很详细,但是还是我们可以理解的 ,所以也只好硬着头皮去看,不去看你永远不会,学习本身就是一个积累,不放弃,不抛弃。看了别让人写的下拉刷新上拉加载,看起来也能看懂,可是一到自己真的去实现去敲的时候,还真的是要费一些心思,本来很菜,但是贵在学习吗,不扯了,表演重点,我不会总结,也就是在博客瞎写写,防止以用的时候有时候自己懵逼了 还要到处找,就在这里进行我的点

489

android中listview下拉刷新,上拉载入更多示例,Android中Listview下拉刷新和上拉加载更多的多种实现方案...

listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明。方案一:添加头布局和脚布局android系统为listview提供了addfootview和addheadview两个API。这样可以直接自定义一个View,以添加视图的形式实现下来刷新和上拉加载。实现步骤1、创建一个类继承ListView:class PullToRefreshListView exten...

weixin_34748612的博客 789

Android中ListView下拉刷新上拉加载更多效果实现

在Android开发中,下拉刷新和上拉加载更多在很多app中都会有用到,下面就是具体的实现的方法。 首先,我们自定义一个RefreshListView来继承与ListView,下面是代码: package com.example.downrefresh; import java.text.SimpleDateFormat; import android.content.Co

StarShine 1431

自定义下拉刷新和上拉加载更多ListView 拷贝可直接使用

是现今主流的下拉刷新和上拉加载更多ListView; 有等待动画和箭头指示,还可以显示最后更新时间. 废话不多说,直接上代码.有注释,可以慢慢看 package com.spider.reader.view; import java.text.SimpleDateFormat; import java.util.Date; import android.content.Context;

wuseal的专栏 1855

android自定义上拉刷新,Android自定义listview布局实现上拉加载下拉刷新功能

listview实现上拉加载以及下拉刷新的方式有很多。下面是我写的一种自定义的布局,复用性也比较的强。首先就是继承的listview的自定义view。AutoListView.Java:package com.example.mic.testdemo.view;import android.annotation.TargetApi;import android.content.Context;im...

weixin_26934905的博客 334

Android自定义控件(一) 下拉刷新,上拉分页加载更多(支持ListView, GridView, ScrollView)

项目中用到了下拉刷新和上啦加载

OyangYujun的专栏 1万+

android横向加载更多,Android开发ListView中下拉刷新上拉加载及带列的横向滚动实现方法...

ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本。可使用 ListView 控件将称作 ListItem 对象的列表条目组织成下列四种不同的视图之一:1.大(标准)图标2.小图标3.列表4.报表 View 属性决定在列表中控件使用何种视图显示项目。还可用 LabelWrap 属性控制列表中与项目关联的标签是否可换行显示。另外,...

weixin_28946193的博客 496
上一篇: Android中的网络编程
下一篇: Android中Activity的生命周期
diebing0439
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值