安卓实现下拉刷新效果

Posted 西红柿里没有番茄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓实现下拉刷新效果相关的知识,希望对你有一定的参考价值。

先上效果图:

 

使用网络应用时,比如QQ、微信这些,我们经常会通过下拉实现消息的刷新。下面记录一种通过调用第三方文件实现下拉刷新ListView的方法

 

步骤一、先在github中搜索android-PullToRefresh-master并下载

步骤二、在AndroidStudio中新建一个项目,右键Importt Module导入Android-PullToRefresh-master中的library文件(注意调整好项目的sdk和jdk版本)如何导入类库文件?

步骤三、复制类库文件library中的PullToRefreshListView.java的路径到自己新建的项目中的布局文件中,并给它添加宽高和id,如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.contentprovide.liuliu.demo_3_3_7.MainActivity">

   <com.handmark.pulltorefresh.library.PullToRefreshListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/my_listview"
       ></com.handmark.pulltorefresh.library.PullToRefreshListView>

</LinearLayout>

 

 

 步骤四、在java文件中使用集合和适配器给集合添加列表项内容,在异步线程中处理刷新行为,并且在ListView对象中的监听事件中执行异步线程

package com.contentprovide.liuliu.demo_3_3_7;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    PullToRefreshListView my_listview;

    //定义一个集合对象用于存放listview的列表项内容
    List<String> list;

//    定义一个ListView适配器
    ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        my_listview = (PullToRefreshListView) findViewById(R.id.my_listview);

        list = new ArrayList<>();
        list.add("Item1");
        list.add("Item2");
        list.add("Item3");
        list.add("Item4");

        arrayAdapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,list);

//        把适配器添加ListView对象中
        my_listview.setAdapter(arrayAdapter);

//        设置事件监听器
        my_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
//                执行异步线程
                asyncTask.execute();
            }
        });



    }

//    在异步线程中处理刷新行为
    AsyncTask<Void,Void,Void> asyncTask = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
//            手动休眠三秒,模仿从服务器端获取信息的延迟
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            list.add("新增加的Item1");
            list.add("新增加的Item2");

//            通知ListView对象刷新完成
            my_listview.onRefreshComplete();
        }
    };



}

 

今天看到之前写的这篇博客突然发现了一个问题,我上面写的这个刷新程序当我连续下拉刷新了两次之后程序就会崩溃强制弹出,后来重新看了一遍代码发现是线程执行那里的问题。AsyncTask的对象是只能执行一次的 ,如果我需要执行同一个线程对象多次可以使用匿名对象,每一次都用一个新的对象去执行。下面是我更新后的步骤四的代码,其他步骤没有问题:

package com.contentprovide.liuliu.demo_3_3_7;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    PullToRefreshListView my_listview;

    //定义一个集合对象用于存放listview的列表项内容
    List<String> list;

//    定义一个ListView适配器
    ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        my_listview = (PullToRefreshListView) findViewById(R.id.my_listview);

        list = new ArrayList<>();
        list.add("Item1");
        list.add("Item2");
        list.add("Item3");
        list.add("Item4");

        arrayAdapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,list);

//        把适配器添加ListView对象中
        my_listview.setAdapter(arrayAdapter);

//        设置事件监听器
        my_listview.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener<ListView>() {
            @Override
            public void onRefresh(PullToRefreshBase<ListView> refreshView) {
//                执行异步线程
 new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
//            手动休眠三秒,模仿从服务器端获取信息的延迟
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            list.add("新增加的Item1");
            list.add("新增加的Item2");

//            通知ListView对象刷新完成
            my_listview.onRefreshComplete();
        }
    };
.execute(); } }); 

}

 

以上是关于安卓实现下拉刷新效果的主要内容,如果未能解决你的问题,请参考以下文章

Android仿苹果版QQ下拉刷新实现 ——打造简单平滑的通用下拉刷新控件

安卓 教你怎么使用下拉刷新

小程序下拉刷新

安卓实现下拉刷新上拉加载

ios 小程序兼容问题(下拉刷新)

android 安卓自定义listview实现下拉刷新