Android 下拉刷新上拉载入效果功能

应用场景:

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

知识点介绍:

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

android-pulltorefresh

【一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView、ViewPager、WevView、ExpandableListView、GridView、(Horizontal )ScrollView、Fragment上下左右拉动刷新,比以下johannilsson那个仅仅支持ListView的强大的多。而且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好。

项目地址:

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

Demo地址:

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

下载地址:

http://download.csdn.net/detail/ma_hoking/7276365

时间: 2024-10-10 05:49:44

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

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

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉载入,而是针对下拉刷新上拉载入经常使用的一些应用场景即可了一些总结,包括了下拉刷新上拉载入过程中遇到的一些手势冲突问题的解决方法(仅仅能算是抛砖引玉). 去年9月的时候.那时自己正在独立做Android项目. 记得刚刚写完那个ListView列表页面(木有下拉刷新,上

Android 下拉刷新上拉加载效果功能,使用开源项目android-pulltorefresh实现

应用场景: 在App开发中,对于信息的获取与演示,不可能全部将其获取与演示,为了在用户使用中,给予用户以友好.方便的用户体验,以滑动.下拉的效果动态加载数据的要求就会出现.为此,该效果功能就需要应用到所需要的展示页面中. 知识点介绍: 本文主要根据开源项目android-pulltorefresh展开介绍. android-pulltorefresh [一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.G

Android 下拉刷新上拉加载效果功能

应用场景: 在App开发中,对于信息的获取与演示,不可能全部将其获取与演示,为了在用户使用中,给予用户以友好.方便的用户体验,以滑动.下拉的效果动态加载数据的要求就会出现.为此,该效果功能就需要应用到所需要的展示页面中. 知识点介绍: 本文主要根据开源项目android-pulltorefresh展开介绍. android-pulltorefresh [一个强大的拉动刷新开源项目,支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.G

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

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉加载,而是针对下拉刷新上拉加载常用的一些应用场景就行了一些总结,包含了下拉刷新上拉加载过程中遇到的一些手势冲突问题的解决方法(只能算是抛砖引玉). 去年9月的时候,那时自己正在独立做Android项目.记得刚刚写完那个ListView列表页面(木有下拉刷新,上拉加载)

自个儿写Android的下拉刷新/上拉加载控件 (续)

本文算是对之前的一篇博文<自个儿写Android的下拉刷新/上拉加载控件>的续章,如果有兴趣了解更多的朋友可以先看一看之前的这篇博客. 事实上之所以会有之前的那篇博文的出现,是起因于前段时间自己在写一个练手的App时很快就遇到这种需求.其实我们可以发现类似这样下拉刷新.上拉加载的功能正在变得越来越普遍,可以说如今基本上绝大多数的应用里面都会使用到.当然,随着Android的发展,已经有不少现成的可以实现这种需求的"轮子"供我们使用了. 但转过头想一下想,既然本来就是自己练手

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

android Fragment 实例 Listfragment listiew 下拉刷新 上拉加载 横向滑动事件监听

Android Fragment开发实例及他色功能说明 代码太长,请网盘下载附件源代码: http://yunpan.cn/cs24a2Z7C5kRk (提取码:a0cf)  有疑问的欢迎联系QQ972910164 一. CustomListView说明:可下拉刷新,上拉加载,横向滑动接口回调, /** * 功能类似ListView,天机以下特性: * 1. 可下拉刷新,上拉加载,实现CustomListView.OnPullListener接口 * 3. Slide切换,实现CustomLis

SwipeRefreshLayout+RecyclerView实现下拉刷新上拉自动加载

在实际开发中,为了节省开发周期,下拉刷新上拉加载通常都会采取使用一些第三方库,典型的就是用PullToRefresh,XListView等等,还有就是谷歌推荐的SwipeRefreshLayout,可惜没有上拉加载功能,需要自己去实现一个上拉加载的脚View,再加上现在代替ListView的RecyclerView+CardView使用的频率也是也来也高,不得不说,CardView效果确实很好看,一个一个的小卡片,用户体验好,I like it!!!废话不说了,奔主题!今天也玩了一下SwipeR

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

listview下拉刷新上拉加载扩展(一) http://blog.csdn.net/baiyuliang2013/article/details/50252561 listview下拉刷新上拉加载扩展(二)-仿美团外卖 http://blog.csdn.net/baiyuliang2013/article/details/50253135 listview下拉刷新上拉加载扩展(三)-仿最新版美团外卖 http://blog.csdn.net/baiyuliang2013/article/det

下拉刷新上拉加载控件+Material Design使用

下拉刷新上拉加载控件+Material Design使用 人所缺乏的不是才干而是志向,不是成功的能力而是勤劳的意志. -- 部尔卫 Material Design控件使用 前几天分享了两篇Material Design控件使用的文章,这里就不多做叙述,下面是传送门,想要学习的小伙伴可以去看下: https://juejin.im/entry/58d8d4d344d90400687c134d/detail#comment https://juejin.im/entry/58d9cdf044d904