刷新

Android应用上下拉刷新实现
本文介绍了一个基于Android平台的应用如何实现上下拉刷新功能。通过自定义PullToRefreshListView组件并结合异步任务来更新数据,同时展示了如何通过监听器响应用户的刷新操作。

BaseActivity

public abstract class BaseActivity extends Activity {




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getActivity());


        initView();


        initData();
    }




    //
    public abstract int getActivity();
    //获取ID
    public abstract void initView();
    //得到数据
    public abstract void initData();

}


HttpUtils

public class HttpUtils {


    private static HttpUtils httpUtils;


    private HttpListener httpListener;


    public static HttpUtils getInstance(){
        if(httpUtils == null){
            httpUtils = new HttpUtils();
        }
        return httpUtils;
    }


    //网络获得请求数据
    public void getdata(String url){
        Myasynctack asynctack = new Myasynctack();
        asynctack.execute(url);


    }


    class Myasynctack extends AsyncTask<String,Void,String>{


        @Override
        protected String doInBackground(String... params) {


            try {
                HttpClient client = new DefaultHttpClient();
                //设置请求方式
                HttpGet get = new HttpGet(params[0]);


                HttpResponse response = client.execute(get);


                int statusCode = response.getStatusLine().getStatusCode();


                if(statusCode == 200){


                    //得到请求到的数据
                    HttpEntity entity = response.getEntity();


                    String s = EntityUtils.toString(entity);


                    return s;
                }


            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);




            httpListener.getjsondata(s);


        }




    }




    //定义接口
    public interface HttpListener{


        void getjsondata(String json);
    }


    //向外提供当前的接口
    public void setHttpListener(HttpListener httpListener){
        this.httpListener = httpListener;


    }


}


MainActivity

public class MainActivity extends AppCompatActivity {


    private PullToRefreshListView pullToRefreshListView;
    private HttpUtils httpUtils = HttpUtils.getInstance();
    private String path = "http://www.yulin520.com/a2a/impressApi/news/mergeList?pageSize=15&page=";
    private int page =1;
    private List<UserBean.DataBean> list = new ArrayList<>();
    private MyBase adapter;
    private Handler handler = new Handler();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.定义方法
        initView();


        getData();


    }
    //设置头部底部的视图
    private void initView() {
        //获取资源ID
        pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_listView);


        //2.设置模式   BOTH 可以上拉 下拉  pull_from_end代表上拉,pull_from_start代表下拉
        pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);


        //3.都是布尔类型  第一个如果为true 时  当前设置的就是头部  如果第二个为true设置的就是底部
        final ILoadingLayout startLoadding = pullToRefreshListView.getLoadingLayoutProxy(true,false);
        startLoadding.setPullLabel("下拉刷新");
        startLoadding.setRefreshingLabel("正在刷新");
        startLoadding.setReleaseLabel("放开刷新");
        ILoadingLayout endLoadding = pullToRefreshListView.getLoadingLayoutProxy(false,true);
        endLoadding.setPullLabel("上拉加载");
        endLoadding.setRefreshingLabel("正在加载");
        endLoadding.setReleaseLabel("放开加载");




        //4.接口回调上拉下拉
        pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            //11.在下拉完成后被回调
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {
                page =1;
                getData();
                //12.
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //必须在异步中完成  在列表没有数据的时候,不再请求接口,调用当前方法
                        pullToRefreshListView.onRefreshComplete();
                    }
                },2000);




                //可以设置刷新的时间....
                startLoadding.setLastUpdatedLabel("上次更新时间:"+new SimpleDateFormat("HH:mm").format(new Date(System.currentTimeMillis())));//last最近的,最后一次update修改/更新


            }
            //11.在上拉完成后被回调
            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> pullToRefreshBase) {


                page+=1;
                getData();
                //12.
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {


                        pullToRefreshListView.onRefreshComplete();
                    }
                },2000);




            }
        });
        //9.创建适配器
        adapter = new MyBase(list,MainActivity.this);
        pullToRefreshListView.setAdapter(adapter);


    }




    //5.得到数据
    public void getData(){


        final String url = path+page;


        httpUtils.getdata(url);


        //6.接口回调得到数据
        httpUtils.setHttpListener(new HttpUtils.HttpListener() {
            @Override
            public void getjsondata(String json) {
                //开始解析
                Gson gson = new Gson();


                UserBean userBean = gson.fromJson(json, UserBean.class);
                //7.解析出来的数据
                List<UserBean.DataBean> data = userBean.getData();


                //8.在list集合中添加数据
                Log.i("TAG",data.size()+"");
                //如果是第一页的数据 清空集合
                if(page == 1){
                    list.clear();
                }
                //将请求到的数据刷新
                list.addAll(data);
                //10.刷新适配器
                adapter.notifyDataSetChanged();


            }
        });










    }






}


MyBase

public class MyBase extends BaseAdapter {


    private List<UserBean.DataBean> list;
    private Context context;


    public MyBase(List<UserBean.DataBean> list, Context context) {
        this.list = list;
        this.context = context;
    }


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


    @Override
    public Object getItem(int position) {
        return null;
    }


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


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


        ViewHolder holder;
        if(convertView == null){
            convertView = View.inflate(context,R.layout.mybase,null);
            holder = new ViewHolder();
            holder.textView = convertView.findViewById(R.id.textView);
            convertView.setTag(holder);


        }else{
            holder = (ViewHolder) convertView.getTag();
        }


            holder.textView.setText(list.get(position).getTitle());


        return convertView;
    }


    class ViewHolder{


        TextView textView;


    }




}


 <com.handmark.pulltorefresh.library.PullToRefreshListView
        xmlns:ptr="http://schemas.android.com/apk/res-auto"
        android:id="@+id/pull_listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ptr:ptrDrawable="@drawable/default_ptr_flip"
        ptr:ptrAnimationStyle="flip"
        ptr:ptrHeaderBackground="#383838"
        ptr:ptrHeaderTextColor="#FFFFFF"
        ></com.handmark.pulltorefresh.library.PullToRefreshListView>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值