应用场景:

在App开发中,对于信息的获取与演示。不可能所有将其获取与演示,为了在用户使用中,给予用户以友好、方便的用户体验,以滑动、下拉的效果动态载入数据的要求就会出现。

为此。该效果功能就须要应用到所须要的展示页面中。

知识点介绍:

本文主要依据开源项目android-pulltorefresh展开介绍。

android-pulltorefresh 

【一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal )ScrollView、Fragment上下左右拉动刷新,比以下johannilsson那个仅仅支持ListView的强大的多。

而且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示。体验更好。】 

项目地址:

https://github.com/chrisbanes/Android-PullToRefresh

Demo地址:

raw=true">https://github.com/Trinea/TrineaDownload/blob/master/pull-to-refreshview-demo.apk?raw=true

使用方式:

第一步:新建AndroidprojectSampleDemo

第二步:在res/values下新建attrs.xml
<?xml version="1.0" encoding="utf-8"?

>
<resources>
<declare-styleable name="PullToRefresh">
<attr name="mode" format="reference" >
<flag name="pullDownFromTop" value="0x1" />
<flag name="pullUpFromBottom" value="0x2" />
<flag name="both" value="0x3" />
</attr>
</declare-styleable>
</resources>
srings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SampleDemo</string>
<string name="action_settings">Settings</string>
<string name="pull_to_refresh_pull_down_label">滑动刷新</string>
<string name="pull_to_refresh_release_label">释放刷新</string>
<string name="pull_to_refresh_refreshing_label">载入中</string>
<string name="pull_to_refresh_tap_label">点击刷新</string>
</resources>

第三步:将所须要的图片文件放入对应的目录以下,所用的图片文件有:


第四步:

1、导入或将开源项目android-pulltorefresh中须要的类文件(.java),增加到自己的项目中的指定包内。

该演示用例涉及的类文件为:

【library\src\com\handmark\pulltorefresh\library】

PullToRefreshAdapterViewBase.java

PullToRefreshBase.java

PullToRefreshListView.java

【library\src\com\handmark\pulltorefresh\library\internal】

EmptyViewMethodAccessor.java

LoadingLayout.java

2、构建自己所须要的类文件(.java)。

【PullTask.java】
import java.util.LinkedList;

import com.example.sampledemo.view.PullToRefreshListView;

import android.os.AsyncTask;
import android.widget.BaseAdapter; public class PullTask extends AsyncTask<Void, Void, String>{ private PullToRefreshListView pullToRefreshListView; //实现下拉刷新与上拉载入的ListView
private int pullState; //记录推断。上拉与下拉动作
private BaseAdapter baseAdapter; //ListView适配器,用于提醒ListView数据已经更新
private LinkedList<String> linkedList; public PullTask(PullToRefreshListView pullToRefreshListView, int pullState,
BaseAdapter baseAdapter, LinkedList<String> linkedList) {
this.pullToRefreshListView = pullToRefreshListView;
this.pullState = pullState;
this.baseAdapter = baseAdapter;
this.linkedList = linkedList;
} @Override
protected String doInBackground(Void... params) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
return "StringTest";
} @Override
protected void onPostExecute(String result) {
if(pullState == 1) {//name="pullDownFromTop" value="0x1" 下拉
linkedList.addFirst("顶部数据");
}
if(pullState == 2) {//name="pullUpFromBottom" value="0x2" 上拉
linkedList.addLast("底部数据");
}
baseAdapter.notifyDataSetChanged();
pullToRefreshListView.onRefreshComplete();
super.onPostExecute(result);
}
}

【PullAdapter.java】

import java.util.LinkedList;

import com.example.sampledemo.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; public class PullAdapter extends BaseAdapter { private LinkedList<String> linkedList;
private LayoutInflater mInflater; public PullAdapter(LinkedList<String> linkedList, Context context) {
mInflater = LayoutInflater.from(context);
this.linkedList = linkedList;
} @Override
public int getCount() {
return linkedList.size();
} @Override
public Object getItem(int position) {
return linkedList.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null; if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.layout_main_listitem, null);
holder.textView = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
if(linkedList.size()>0){
final String dataStr = linkedList.get(position);
holder.textView.setText(dataStr);
}
return convertView;
} private static class ViewHolder {
TextView textView; //数据显示区域
}
}

3、为PullAdapter.java 设计布局文件layout_main_listitem.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:background="#FFFFFF"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:textColor="#99CC66"
android:textSize="18dp"
android:layout_marginTop="4dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left" />
</LinearLayout>

滑动时出现提醒布局文件pull_to_refresh_header.xml

<?xml version="1.0" encoding="utf-8"?

>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="10dp"
android:paddingBottom="10dip">
<TextView
android:id="@+id/pull_to_refresh_text"
android:text="@string/pull_to_refresh_pull_down_label"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
<ProgressBar
android:id="@+id/pull_to_refresh_progress"
android:indeterminate="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dip"
android:layout_marginRight="20dip"
android:visibility="gone"
android:layout_centerVertical="true"
style="?android:attr/progressBarStyleSmall" />
<ImageView
android:id="@+id/pull_to_refresh_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dip"
android:layout_marginRight="20dip"
android:layout_centerVertical="true" />
</RelativeLayout>

MainActivity.java 主布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:cp="http://schemas.android.com/apk/res/com.example.sampledemo"
android:layout_width="match_parent"
android:background="#FFFFFF"
android:layout_height="match_parent">
<com.example.sampledemo.view.PullToRefreshListView
android:id="@+id/pullrefresh"
android:background="#FFFFFF"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@android:color/black"
android:dividerHeight="0.1dip"
android:cacheColorHint="#00000000"
cp:mode="both">
</com.example.sampledemo.view.PullToRefreshListView>
</RelativeLayout>

4、编写MainActivity.java 

import java.util.Arrays;
import java.util.LinkedList; import com.example.sampledemo.view.PullToRefreshBase.OnRefreshListener;
import com.example.sampledemo.view.PullToRefreshListView;
import com.example.sampledemo.view.adapter.PullAdapter;
import com.example.sampledemo.view.task.PullTask; import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.app.Activity;
/**
* @ClassName MainActivity.java
* @Author MaHaochen
* @Date 2014-4-30 15:56:47
*/
public class MainActivity extends Activity {
private LinkedList<String> mListItems;
private PullToRefreshListView mPullRefreshListView;
private ArrayAdapter<String> mAdapter;
private ListView mListView;
private PullAdapter pullAdapter;
private String[] mStrings = { "初始数据01","初始数据02","初始数据03","初始数据04","初始数据05" }; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
} private void initViews() {
mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pullrefresh);
mPullRefreshListView.setOnRefreshListener(mOnrefreshListener);
mListView = mPullRefreshListView.getRefreshableView();
mListItems = new LinkedList<String>();
mListItems.addAll(Arrays.asList(mStrings));
pullAdapter = new PullAdapter(mListItems, MainActivity.this);
mListView.setAdapter(pullAdapter);
} OnRefreshListener mOnrefreshListener = new OnRefreshListener() {
public void onRefresh() {
PullTask pullTask = new PullTask(mPullRefreshListView, mPullRefreshListView.getRefreshType(), pullAdapter, mListItems);
pullTask.execute();
}
};
}

下载地址:


Android 下拉刷新上拉载入效果功能的更多相关文章

  1. Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...

  2. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  3. ListView下拉刷新上拉加载更多实现

    这篇文章将带大家了解listview下拉刷新和上拉加载更多的实现过程,先看效果(注:图片中listview中的阴影可以加上属性android:fadingEdge="none"去掉 ...

  4. RecyclerView下拉刷新上拉加载(三)—对Adapter的封装

    RecyclerView下拉刷新上拉加载(一) http://blog.csdn.net/baiyuliang2013/article/details/51506036 RecyclerView下拉刷 ...

  5. RecyclerView下拉刷新上拉加载(一)

    listview下拉刷新上拉加载扩展(一) http://blog.csdn.net/baiyuliang2013/article/details/50252561 listview下拉刷新上拉加载扩 ...

  6. MaterialRefreshLayout+ListView 下拉刷新 上拉加载

    效果图是这样的,有入侵式的,非入侵式的,带波浪效果的......就那几个属性,都给出来了,自己去试就行. 下拉刷新 上拉加载 关于下拉刷新-上拉加载的效果,有许许多多的实现方式,百度了一下竟然有几十种 ...

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

    自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多 Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时 ...

  8. 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载

    title: 带你实现开发者头条APP(五)--RecyclerView下拉刷新上拉加载 tags: -RecyclerView,下拉刷新,上拉加载更多 grammar_cjkRuby: true - ...

  9. ListView实现Item上下拖动交换位置 并且实现下拉刷新 上拉加载更多

    ListView实现Item上下拖动交换位置  并且实现下拉刷新  上拉加载更多 package com.example.ListViewDragItem; import android.app.Ac ...

  10. [ionic开源项目教程] - 第7讲 实现下拉刷新上拉加载ion-refresher和ion-infinite-scroll

    第7讲 实现下拉刷新上拉加载ion-refresher和ion-infinite-scroll 1.将tab1.html的代码改为如下: <ion-content> <ion-ref ...

随机推荐

  1. VC++实现位图显示透明效果--实现原理

    我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示 ...

  2. win32 sdk 列表视图控件绘制

    ////////////////////////////////////////////////////////////// LRESULT ListViewCustomDraw(HWND hwnd, ...

  3. svn自动发用户名密码到邮件(明文密码)

    #!/bin/sh touch testlist cat /dev/null > testlist grep "=" passwd |grep -v "#" ...

  4. Windows平台Go调用DLL的坑(居然有这么多没听过的名词)

    最近的项目中,使用了GO来开发一些服务中转程序.业务比较简单,但是有一些业务需要复用原有C++开发的代码.而在WINDOWS,用CGO方式来集成C/C++代码并不是太方便.所以用DLL把C++的代码封 ...

  5. CountDownLatch和CyclicBarrier的区别(转)

    在网上看到很多人对于CountDownLatch和CyclicBarrier的区别简单理解为CountDownLatch是一次性的,而CyclicBarrier在调用reset之后还可以继续使用.那如 ...

  6. <Win32_17>集音频和视频播放功能于一身的简易播放器

    前段时间,在学习中科院杨老师的教学视频时,他说了一句话: "我很反对百八十行的教学程序,要来就来一个完整的程序" 对此,我很是赞同.所谓真刀真枪的做了,你才会发现其中的奥秘——然而 ...

  7. MVC多语言应用

    MVC多语言应用 最近发现资源文件是个好东西, 用的好了可以给开发人员借阅不少的时间. 例如做一个多语言的网站, 资源文件就有不小的用处. 这里以MVC4模版项目的登录页为例, 简单说一下过程: 1. ...

  8. 该项目的建设maven片:4.协调和依赖,spring依赖注入demo

    源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...

  9. GitHub基本操作(转)

    一.上传代码到仓库 步骤一:创建本地仓库,如下: 创建结果: 步骤二:发布自己创建的仓库,如下: 发布完显示如下: 步骤三:向自己发布仓库上传代码,如下: 首先将代码复制到本地仓库,如下: 复制完,显 ...

  10. poj3259(spfa判负环)

    题目连接:http://poj.org/problem?id=3259 题意:John的农场里N块地,M条路连接两块地,W个虫洞,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时 ...