Android中AS平臺下製作ListView之下拉刷新-劉宇

在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:Brycen Liu

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章