当前位置: 代码迷 >> Android >> Android 下拉刷新上拉加载成效功能
  详细解决方案

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

热度:61   发布时间:2016-04-28 05:28:10.0
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 

使用方式:

第一步:新建Android工程SampleDemo
第二步:在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;        //数据显示区域	}}

第四步:为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>

第五步:编写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

  相关解决方案