应用场景:
在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
第二步:在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)。
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(); } }; }