Android之xListView网络请求上拉下拉加载

本文介绍了一个自定义的XListView组件的使用方法,包括如何设置下拉刷新和上拉加载更多功能,通过实例演示了如何结合网络请求进行数据的加载与展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 添加网络请求权限
  2. 导入一个依赖库 需要升级到自己当前Studio的版本

    如何将类依赖到依赖库步骤:Project Struture–>在左边选中当前的工程–>点击Dependencies–>右上角红的的加号,选择Module dependency–>点击xListView(名称自定义)这个依赖库–>点击OK,完成。

    一、主方法




  public class MainActivity extends AppCompatActivity {

    private XListView xlistV;
    private int page = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        xlistV = (XListView) findViewById(R.id.xlistV);
        //设置是否可以下拉刷新
        // xlistV.setPullRefreshEnable(true);
        //是否可以上拉更多
         xlistV.setPullLoadEnable(true);
        //刷新时间
         xlistV.setRefreshTime("9:10:02");
        initClint();

        try {
            onCooks("http://apis.juhe.cn/cook/query?key=302e47cc56497312cb48ae3b46af632f&menu="
                    + URLEncoder.encode("秘制红烧肉", "utf-8") + "&pn=" + page + "&rn=" + 10);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }



    }

    //监听
    private void initClint() {
        xlistV.setXListViewListener(new XListView.IXListViewListener() {
            //下拉刷新更多
            @Override
            public void onRefresh() {
                //请求第二页的数据,  把最新的数据加载在前面
                ++page;
                try {
                    onCooks("http://apis.juhe.cn/cook/query?key=302e47cc56497312cb48ae3b46af632f&menu="
                            + URLEncoder.encode("秘制红烧肉", "utf-8") + "&pn=" + page + "&rn=" + 10);
                   //停止刷新
                    xlistV.stopRefresh(true);
                    System.out.println("下拉啦");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }

            //上拉加载更多
            @Override
            public void onLoadMore() {
                ++page;
                try {
                    onCooks("http://apis.juhe.cn/cook/query?key=302e47cc56497312cb48ae3b46af632f&menu="
                            + URLEncoder.encode("秘制红烧肉", "utf-8") + "&pn=" + page + "&rn=" +10);
                xlistV.stopLoadMore();
                    System.out.println("上拉啦");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public void onCooks(String path) {
        //异步操作
        new AsyncTask<String, Void, String>() {


            private MyBaseAdapter adapter;
            private Bean bean;

            //UI更新
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                if (s == null) {
                    return;
                }

                //添加适配器
                if (adapter == null){
                    //如果是第一次进就为空
                    adapter = new MyBaseAdapter(MainActivity.this, bean.getResult().getData());
                }else{
                    //加载更多
                    adapter.addMore(bean.getResult().getData());
                    adapter.notifyDataSetChanged();
                }
                xlistV.setAdapter(adapter);
            }
             //网络请求
            @Override
            protected String doInBackground(String... params) {
                String path = params[0];
                try {
                    URL url = new URL(path);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setReadTimeout(5000);
                    connection.setConnectTimeout(5000);

                    int code = connection.getResponseCode();
                    if (code == 200) {
                        InputStream input = connection.getInputStream();
                        String json = MyUtils.onStrem(input);
                        //转换成对象
                        Gson gson = new Gson();
                        bean = gson.fromJson(json, Bean.class);


                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return "";
            }
        }.execute(path);
    }
}

               //二、Utils类  流的转换
         //流的转换
public class MyUtils {
    public static String onStrem (InputStream input){
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] by = new byte[1024];
            int len = 0;
            while ((len = input.read(by)) != -1){
                out.write(by,0,len);
            }
            return out.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

     //三、Bean类   添加属性实现get  set方法

     四、BaseAdapter类    实现适配器
public class MyBaseAdapter extends BaseAdapter {
    private Context context;
    private List<Bean.ResultBean.DataBean> list;
    private viewHolder holder;
    private TextView ontv;

    public MyBaseAdapter (Context context, List<Bean.ResultBean.DataBean> list){
        this.context = context;
        this.list = list;
    }
    //加载更多数据
    public void addMore(List<Bean.ResultBean.DataBean> lists){
        //foreach循环
        for (Bean.ResultBean.DataBean data: lists) {
            //将最新的数据添加到适配器定义的集合中
            list.add(0,data);
        }
    }

    @Override
    public int getCount() {
        return list != null ? list.size() : 0;
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null){
            convertView = View.inflate(context, R.layout.list_load,null);
            holder = new viewHolder();
            holder.ontv = (TextView) convertView.findViewById(R.id.ontv);
            convertView.setTag(holder);
        }else{
           holder = (viewHolder) convertView.getTag();
        }
        //重写信息
        holder.ontv.setText(list.get(position).getTags());
        return convertView;
    }
    class viewHolder {
        private TextView ontv;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值