ANDROID下滑刷新列表官方实现

在屏幕上用你的拇指按住屏幕下滑刷新列表,这个动作现在基本成了习惯,基本上绝大部分手机的应用都是这么实现的,那么这个过程到底是怎么实现的呢,不了解的话感觉不太好实现,但是现在Android官方已经提实现的组件,用起来非常方便而且简单,简单到你都敢相信这是真的,下面就来看看

如何创建项目什么的这里就不再多说了,可以查阅前面的一些文章

直接贴上SwipeRefreshLayout布局文件,activity_refreshview.xml

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView">
    </ListView>

</android.support.v4.widget.SwipeRefreshLayout>

布局里面放一个listview,那么listview需要一行的布局list_row.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">

    <TextView
        android:id="@+id/title"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:paddingLeft="20dp"
        android:textSize="18dp" />

</LinearLayout>

 

这里只是个实例,一行就显示一个文本,下面开始代码部分,先来定义一行对应的一个实体Movie.java

public class Movie {
    public int id;
    public String title;

    public Movie() {
    }

    public Movie(int id, String title) {
        this.title = title;
        this.id = id;
    }
}

实现listview的adapter ,SwipeListAdapter.java

public class SwipeListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<Movie> movieList;

    public SwipeListAdapter(Activity activity, List<Movie> movieList) {
        this.activity = activity;
        this.movieList = movieList;
    }

    @Override
    public int getCount() {
        return movieList.size();
    }

    @Override
    public Object getItem(int location) {
        return movieList.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.list_row, null);

        TextView title = (TextView) convertView.findViewById(R.id.title);

        title.setText(movieList.get(position).title);

        return convertView;
    }

}

然后再看看activity里面的代码

public class RefreshActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {

    private SwipeRefreshLayout swipeRefreshLayout;
    private ListView listView;
    private SwipeListAdapter adapter;
    private List<Movie> movieList;

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

        listView = (ListView) findViewById(R.id.listView);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);

        movieList = new ArrayList<>();
        adapter = new SwipeListAdapter(this, movieList);
        listView.setAdapter(adapter);

        swipeRefreshLayout.setOnRefreshListener(this);

        fetchMovies();
    }

    @Override
    public void onRefresh() {
        fetchMovies();
    }

    /**
     * Fetching movies json by making http call
     */
    private void fetchMovies() {

        // showing refresh animation before making http call
        swipeRefreshLayout.setRefreshing(true);

        //异步请求数据
        Movie movie = new Movie();
        movie.title = "new item";
        movieList.add(movie);

        //这个方法需要在UI线程中执行
        adapter.notifyDataSetChanged();

        //
        swipeRefreshLayout.setRefreshing(false);

    }
}

这里来简单解释一下

1.实现刷新接口OnRefreshListener的事件onRefresh,这就是拇指下滑产生的事件了

2.onRefresh里面做的事情有三部,第一显示加载的图标swipeRefreshLayout.setRefreshing(true);然后就使用异步方式去后台请求数据,这个参阅之前的文章如何异步调用ANDROID异步调用,获取导数据之后添加的列表里面movieList.add(movie); 最后在UI线程里面通知列表有数据要更新了,最后把加载的图标隐藏swipeRefreshLayout.setRefreshing(false);

3.大功告成

总结

这个下滑刷新列表貌似是那个什么特推首创,具体不可考究,不过现在是所有的应用都可以这么做了,所有使用手机的人都享受着这样的创意所带来的优美用户体验,Android发展到现在,这些体验的代码实现已经变得简单而不足为道了。

《ANDROID下滑刷新列表官方实现》有一个想法

发表评论