美文网首页
Android之SwipeRefreshLayout下拉刷新

Android之SwipeRefreshLayout下拉刷新

作者: ryanxun | 来源:发表于2019-06-15 21:54 被阅读0次

    SwipeRefreshLayout是谷歌内部提供的一款下拉刷新,我使用了一下并配合抓取网络Json数据贼好用
    因为我抓的是网络数据需要加网络权限

    //这是网络权限
     <uses-permission android:name="android.permission.INTERNET"/>
    

    然后是创建一个网络请求的构造器,这个构造器的作用是可以从外界传一个地址进来

    
    package com.example.ryan.swiperefresh;
    
    import android.net.Uri;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class Fetcher {
        private String address;
    
        public Fetcher(String address){
            this.address=address;
        }
    
        public String fetcher() {
            String info="";
            try {
                URL url=new URL("https://api.myjson.com/bins/8sd7h");
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                InputStream inputStream=connection.getInputStream();
                //如果获取到编码格式使用这个代码
    //            String encoding=connection.getContentEncoding();
                int len =connection.getContentLength();
                byte[] buf=new byte[len];
                inputStream.read(buf);
                //获取到编码格式传递Encoding
    //            info=new String(buf,encoding);
                info=new String(buf);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return info;
        }
    }
    

    创建完这个构造器,我重写了一个ListViewAdapter,我个人觉得重写ListView比给的Arrayadapter和SimpleAdapter要简单
    重写ListView需要一个类,我这里是一个User类

    package com.example.ryan.swiperefresh;
    
    public class User {
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        String name;
        int age;
    }
    
    

    有了类需要一个Adapter,所以建立一个UserAdapter

    package com.example.ryan.swiperefresh;
    
    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class UserAdapter extends ArrayAdapter<User> {
        private Context context;
        private int resource;
        private List<User> users;
        public UserAdapter(@NonNull Context context, int resource, List<User> users) {
            super(context, resource, users);
            this.context=context;
            this.users=users;
            this.resource=resource;
        }
    
        @Override
        public int getCount() {
            return users.size();
        }
    
        @Nullable
        @Override
        public User getItem(int position) {
            return users.get(position);
        }
    
        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null){
                convertView=LayoutInflater.from(this.context).inflate(this.resource,parent,false);
            }
            TextView userTv=convertView.findViewById(R.id.userTv);
            TextView ageTv=convertView.findViewById(R.id.ageTv);
    
            userTv.setText(users.get(position).getName());
            ageTv.setText(users.get(position).getAge()+"");
            return convertView;
        }
    }
    

    这里我们需要一个布局文件,来排列ListView,我这么做了一个user_layout

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/userTv"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/ageTv"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    我这里只是简单渲染一下name和age,并不复杂

    我们看一下activity_main的内容

    <?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=".MainActivity">
    
        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_ly"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    
            <ListView
                android:id="@+id/listview"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            </ListView>
    
        </android.support.v4.widget.SwipeRefreshLayout>
    
    </LinearLayout>
    

    这里没有什么过多的东西,SwipeRefreshLayout的定义和ListView的定义

    接下来我们来看一下Json的解析和下拉更新

    package com.example.ryan.swiperefresh;
    
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ListView;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        private String address="https://api.myjson.com/bins/8sd7h";
        private ListView listview;
        private SwipeRefreshLayout swipeRefreshLayout;
        private List<User> user;
        private UserAdapter adapter;
        private Handler handler;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            user=new ArrayList<>();
            adapter=new UserAdapter(this,R.layout.user_layout,user);
            listview=findViewById(R.id.listview);
            listview.setAdapter(adapter);
            swipeRefreshLayout=findViewById(R.id.swipe_ly);
    
            //在listview上做一个下拉刷新的监听
            swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    handler=new Handler(){
                        @Override
                        public void handleMessage(Message msg) {
                            if (msg.what==1){
                                adapter.notifyDataSetChanged();
                                swipeRefreshLayout.setRefreshing(false);
                            }
                        }
                    };
                    new Thread(){
                        @Override
                        public void run() {
                            String info=new Fetcher(address).fetcher();
                            try {
                                JSONArray jsa=new JSONArray(info);
                                for (int i=0;i<jsa.length();i++){
                                    JSONObject jso=jsa.getJSONObject(i);
                                    User u=new User();
                                    u.setName(jso.getString("name"));
                                    u.setAge(jso.getInt("age"));
                                    user.add(u);
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            handler.sendEmptyMessage(1);
    
                        }
                    }.start();
                    //在这做下拉操作
                    //我这里放了一个handle模拟延时操作
                    //模拟网络请求需要3000毫秒,请求完成,设置setRefreshing 为false
    //                new Handler().postDelayed(new Runnable() {
    //                    @Override
    //                    public void run() {
    //                        swipeRefreshLayout.setRefreshing(false);
    //                    }
    //                }, 3000);
    
                }
            });
        }
    
    }
    
    

    这样我们就做出了没下拉一次更新一次

    效果大概这样

    image.png
    image.png
    image.png

    相关文章

      网友评论

          本文标题:Android之SwipeRefreshLayout下拉刷新

          本文链接:https://www.haomeiwen.com/subject/jnyifctx.html