1. 程式人生 > >Android 下拉刷新上拉載入效果功能

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

使用方式 blank 新建 ann out hlist tar sha mstr

應用場景:

在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

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