Android-AS平台下制作ListView之下拉刷新

来源:互联网 发布:手机查看端口被占用 编辑:程序博客网 时间:2024/05/01 16:33

在Androidstudio下配置下拉刷新功能,这个功能需要借助一个开源PullToRefresh项目,GitHub地址:https://github.com/chrisbanes/Android-PullToRefresh/


我的源码下载地址:http://download.csdn.net/detail/liuyu973971883/9595478

然后我们将其导入,发现有四个项目分,我们需要用的是最后三个文件夹,将他们已Module方式导入项目中


————————————————————————————————————————————————————————

大多数人发现导入后发生了一大推的错误,这些错误是因为三个Module的build.gradle文件配置需要修改,修改前后的代码对比:

Module:library的build.gradle修改前:

apply plugin: 'com.android.library'android {    compileSdkVersion 16        //需要修改    buildToolsVersion "19.1.0"  //需要修改    defaultConfig {        minSdkVersion 4         //需要修改        targetSdkVersion 4      //需要修改    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'        }    }}

修改后:

apply plugin: 'com.android.library'android {    compileSdkVersion 24        //需要修改    buildToolsVersion "24.0.1"  //需要修改    defaultConfig {        minSdkVersion 15        //需要修改        targetSdkVersion 24      //需要修改    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'        }    }}

Module:pullToRefreshListFragment的build.gradle修改前:

apply plugin: 'com.android.library'android {    compileSdkVersion 16    //需要修改    buildToolsVersion "19.1.0"  //需要修改    defaultConfig {    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'        }    }}dependencies {    compile project(':library')    compile 'com.android.support:support-v4:18.+'   //需要修改}
修改后:

apply plugin: 'com.android.library'android {    compileSdkVersion 24    //需要修改    buildToolsVersion "24.0.1"  //需要修改    defaultConfig {    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'        }    }}dependencies {    compile project(':library')    compile 'com.android.support:appcompat-v7:24.1.1'   //需要修改}

Module:pullToRefreshViewPager的build.gradle修改前:

apply plugin: 'com.android.library'android {    compileSdkVersion 16    //需要修改    buildToolsVersion "19.1.0"  //需要修改    defaultConfig {        minSdkVersion 4 //需要修改        targetSdkVersion 4  //需要修改    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'        }    }}dependencies {    compile project(':library')    compile 'com.android.support:support-v4:18.+'   //需要修改}
修改后:

apply plugin: 'com.android.library'android {    compileSdkVersion 24    //需要修改    buildToolsVersion "24.0.1"  //需要修改    defaultConfig {        minSdkVersion 15 //需要修改        targetSdkVersion 24  //需要修改    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'        }    }}dependencies {    compile project(':library')    compile 'com.android.support:appcompat-v7:24.1.1'   //需要修改}


在上面三个gradle文件修改好后需要点击try again进行重构,随后又出现如下问题:


出现问题千万不能慌,程序会跳转到出问题的那个文件,这个问题是因为在android6.0中FloatMath改为了Math,我们只需要修改一下即可,将下面两句代码进行修改:

float exactContentHeight = Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale());
return (int) Math.max(0, FloatMath.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale())
修改为:

float exactContentHeight = (float) Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale());
return (int) Math.max(0, Math.floor(mRefreshableView.getContentHeight() * mRefreshableView.getScale())
上面修改的地方只是将FloatMath改为了Math,第一处修改的地方进行强转即可,到这里错误就解决了,还差最后一步,就是依赖关系

——————————————————————————————————————————

错误排除了,点击你的APP右击进行Module设置,将你刚刚那三个Module添加到APP里面


——————————————————————————————————————————

终于到写代码的时候了,真不容易这一路

首先,我们需要配置一下你的主Activity 的布局文件,在里面插入library中配置好的ListView,代码如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.oak.learnrefreshlistview.MainActivity">    <com.handmark.pulltorefresh.library.PullToRefreshListView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/reListView">    </com.handmark.pulltorefresh.library.PullToRefreshListView></RelativeLayout>

然后我们进入MainActivity.java文件进行配置:

package com.oak.learnrefreshlistview;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Adapter;import android.widget.ArrayAdapter;import android.widget.ListAdapter;import android.widget.ListView;import com.handmark.pulltorefresh.library.PullToRefreshBase;import com.handmark.pulltorefresh.library.PullToRefreshListView;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    private PullToRefreshListView lv;   //libarary配置好的listView    private ArrayAdapter adapter;       //ListView适配器    private ArrayList arrayList;        //用来存放字符串用的list集合    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        arrayList = new ArrayList();        arrayList.add("111");//添加三个字符串到集合中        arrayList.add("222");        arrayList.add("333");        //配置适配器,我这里用的专门存放String的适配器        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arrayList);        //拿到listView        lv = (PullToRefreshListView) findViewById(R.id.reListView);        //将适配器设置到listview中        lv.setAdapter(adapter);        //调用listView下拉刷新侦听        lv.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {            @Override            public void onRefresh(PullToRefreshBase<ListView> refreshView) {                //new一个异步类                new AsyncTask<Void,Void,Void>(){                    @Override                    protected Void doInBackground(Void... voids) {                        try {                            //在这里让线程睡眠3秒,以便看出正在刷新的效果,到时候这里就写网络交互的代码                            Thread.sleep(3000);                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                        return null;                    }                    //此方法是在doInBackground执行完后会执行                    @Override                    protected void onPostExecute(Void aVoid) {                        super.onPostExecute(aVoid);                        //向适配器添加新的数据                        adapter.addAll("3333","44444");                        //调用listview刷新完成方法                        lv.onRefreshComplete();                    }                }.execute();            }        });    }}
到这里,我们就完成了一个listview的下拉刷新了,效果图如下:




By:Oak先生



1 0
原创粉丝点击