国庆技术博客之XListView的上拉刷新和下拉加载

来源:互联网 发布:背包问题 python 编辑:程序博客网 时间:2024/05/17 08:09

                                XListView的上拉加载下拉刷新

          

         今天我来跟大家分享一下XListView的上拉加载下拉刷新,在以后的开发中会经常用到,首先要先导入XListView源码,然后在布局文件中布局,定义一些控件,然后在MainActivity中定义一些全局变量,再找控件,定义一变量path=1,   boolean flag=true;再调用加载数据的initData()方法,创建并设置适配器,设置上拉加载下拉刷新的一些状态,还有下拉刷新的时间,给XListView设置点击事件, onRefresh如果flag为false就下拉刷新数据,刷新数据为最初数据,

  XListView源码网址:   http://www.jianshu.com/p/9c40c0968f4b

            首先要导入源码


                path=1;
                调用异步加载数据的方法
                initData()

     @Override
            public void onLoadMore() {
                // 如果flag=true;就上拉加载数据
                flag=true;
                path++;
                //调用异步加载数据的方法
                initData();
                //吐司
                Toast.makeText(MainActivity.this, "path目前等于:"+path, 0).show();
                //停止加载
                xlv.stopLoadMore();
            }

 创建MyXListViewAdapter适配器并优化

  创建异步加载的方法在 doInBackground中调用加载网络数据的方法,在onPostExecute中刷新适配器并开启任务,在加载网络数据的方法中URL url = new URL("https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page=" +path);

  Gson解析数据,做一个判断,如果fls为true就把json.getNewslist()拼接进去进行加载数据
                else就走list=json.getNewslist();
                if (flag) {
                    //list.addAll拼接
                    list.addAll(json.getNewslist());
                } else {
                    list=json.getNewslist();
                }

    注意在清单文件中写网络权限,导入Gson架包,以下是全部代码

  实现思路
 
 XlistView:就是一个实现了上拉刷新,下拉加载的自定义控件,我们如果集成他,就可以很轻松实现这些效果
  1.搭建XlistView的环境(拷贝资源:java代码,XML布局,strings资源,图片)
   2.布局编写,初始化控件
   3.初始化数据(一般网络的数据,进行解析封装到集合中,去使用)
   4.相当于listVIew的使用,创建适配器,设置适配器等等,(此时效果不佳)
   5.要进行XlistVIew设置下拉刷新,上拉加载的开启操作
   6.设置XlistVIew设置下拉刷新,上拉加载的监听操作
   7.编写下拉刷新,上拉加载的业务逻辑代码
  8.关闭下拉刷新,上拉加载的业务逻辑
  注意:如果你想把数据放到listVIew顶部,那么这个数据就放到集合的0的位置就可以了.
  提示你改布局,不要动控件的ID,你直接改控件内容即可

     

MainActivity类

public class MainActivity extends Activity {
    //全局变量
    private List<NewsListData> list = new ArrayList<NewsListData>();
    XListView xlv;
    MyXListViewAdapter adapter;
    int path = 1;
    boolean flag=true;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找控件
        xlv=(XListView) findViewById(R.id.xlv);
        //调用异步加载数据的方法
        initData();
        //创建适配器
        adapter=new MyXListViewAdapter();
        //设置适配器
        xlv.setAdapter(adapter);
        //设置下拉刷新状态
        xlv.setPullRefreshEnable(true);
        //设置上拉加载状态
        xlv.setPullLoadEnable(true);
        //设置下拉刷新的时间
        xlv.setRefreshTime("2017-10-18");
        //XListView的点击
        xlv.setXListViewListener(new IXListViewListener() {
            
            @Override
            public void onRefresh() {
                 //如果flag为false就下拉刷新数据
                flag=false;
                //刷新数据为最初数据
                path=1;
                //调用异步加载数据的方法
                initData();
                //吐司
                Toast.makeText(MainActivity.this, "path目前等于:"+path, 0).show();
                 //停止刷新
                xlv.stopRefresh();
            }
            
            @Override
            public void onLoadMore() {
                // 如果flag=true;就上拉加载数据
                flag=true;
                path++;
                //调用异步加载数据的方法
                initData();
                //吐司
                Toast.makeText(MainActivity.this, "path目前等于:"+path, 0).show();
                //停止加载
                xlv.stopLoadMore();
            }
        });
    }
    //创建适配器
    public class MyXListViewAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            if (list != null) {
                return list.size();
            }
            return 0;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 优化
            ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(MainActivity.this,
                        R.layout.list_item, null);
                holder = new ViewHolder();
                holder.tv_ctime = (TextView) convertView
                        .findViewById(R.id.tv_ctime);
                holder.tv_title = (TextView) convertView
                        .findViewById(R.id.tv_title);
                holder.tv_description = (TextView) convertView
                        .findViewById(R.id.tv_description);
                holder.tv_url = (TextView) convertView
                        .findViewById(R.id.tv_url);
                holder.iv_picUrl = (ImageView) convertView
                        .findViewById(R.id.iv_picUrl);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.tv_ctime.setText(list.get(position).getCtime());
            holder.tv_title.setText(list.get(position).getTitle());
            holder.tv_description.setText(list.get(position).getDescription());
            holder.tv_url.setText(list.get(position).getUrl());
            ImageLoader.getInstance().displayImage(list.get(position).getPicUrl(), holder.iv_picUrl);
            return convertView;
        }

    }
      //优化帮助类
    private static class ViewHolder {
        TextView tv_ctime, tv_title, tv_description, tv_url;
        ImageView iv_picUrl;
    }
  //异步加载数据的方法
    public void initData() {
        new AsyncTask<String, String, String>() {

            @Override
            protected String doInBackground(String... params) {
                // 调用 方法
                getData();
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                // 刷新适配器
                adapter.notifyDataSetChanged();
            
                super.onPostExecute(result);
            }
        }.execute();
    }
    //获取网络数据的方法
    public void getData() {
        try {
            URL url = new URL(
                    "https://api.tianapi.com/wxnew/?key=8d6e3228d25298f13af4fc40ce6c9679&num=10&page="
                            + path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            int code = conn.getResponseCode();
            if (code == 200) {
                //Gson解析
                Gson gson = new Gson();
                JsonData json = gson.fromJson(
                        new InputStreamReader(conn.getInputStream()),
                        JsonData.class);
                //如果fls为true就把json.getNewslist()拼接进去进行加载数据
                //else就走list=json.getNewslist();
                if (flag) {
                    //list.addAll拼接
                    list.addAll(json.getNewslist());
                } else {
                    list=json.getNewslist();
                }
                Log.i("+++++++++++++++++++++++", list+"");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Layout布局


<?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="wrap_content"
    android:orientation="vertical" >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:orientation="horizontal"
        >
        <TextView
        android:id="@+id/tv_ctime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
        <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
        <TextView
        android:id="@+id/tv_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
        <TextView
        android:id="@+id/tv_url"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </LinearLayout>
    <ImageView
        android:id="@+id/iv_picUrl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>




原创粉丝点击