XListView上拉加载,下拉刷新

本文介绍了一种基于Android平台的应用程序中实现分页加载的方法。通过使用XListView组件,结合HttpUtils发起HTTP请求,实现了数据的动态加载及刷新功能。文章详细展示了如何通过自定义的Adapter展示数据,并提供了上拉加载更多、下拉刷新等功能的具体实现。

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

一、导library
二、配权限
三、代码

package com.mynews.fragment;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

import com.google.gson.Gson;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import com.mynews.InfoActivity;
import com.mynews.R;
import com.mynews.adapter.MyDataAdapter;
import com.mynews.bean.Datas;
import com.mynews.bean.MyData;
import com.mynews.xlistview.XListView;
import com.mynews.xlistview.XListView.IXListViewListener;

public class MyFragments extends Fragment implements IXListViewListener{
String url;//每个分类网址
XListView xlistview;
int pageIndex=10;
private List list;
private Handler handler=new Handler(){};
private String str;
private MyDataAdapter adapter;
public MyFragments(String url) {
this.url=url;
}
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_hs, null);
xlistview=(XListView) view.findViewById(R.id.xlistview);
xlistview.setPullLoadEnable(true);
xlistview.setPullRefreshEnable(true);
xlistview.setXListViewListener(this);//实现IXListViewListener接口
getdata();
xlistview.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Intent it=new Intent(getActivity(),InfoActivity.class);
            it.putExtra("list",list.get(position-1).url);//XListView因为添加了Header,会导致存储的数据+1,所以赋值时需要position-1。补充:当去掉HeaderView时,position不用-1。
            //提个建议:上拉加载更多,最好在onCreate()中就执行setAdapter,然后不论是空数据、还是有数据,只用更新适配器就行了。
            startActivity(it);
        }
    });
    return view;
}
private void getdata() {
    HttpUtils httpUtils=new HttpUtils();
    httpUtils.configResponseTextCharset("utf-8");
    httpUtils.send(HttpMethod.POST, url+pageIndex, new RequestCallBack<String>(){



        @Override
        public void onFailure(HttpException arg0, String arg1){

        }
        @Override
        public void onSuccess(ResponseInfo<String> arg0){
            str = arg0.result;
            Gson gson=new Gson();
            MyData mydata=gson.fromJson(str, MyData.class);
            list = mydata.data;
            adapter = new MyDataAdapter(getActivity(), list);
            xlistview.setAdapter(adapter);
        }
    });     
}
//上拉帅新
@Override
public void onRefresh() {
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
            //请求书数据
            getdata();
            //更新界面显示 
            onLoad();
        }
    }, 2000);
}
//加载完数据后,复位header view和footer view,并设置更新的时间。
protected void onLoad() {
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
            xlistview.stopRefresh();
            xlistview.stopLoadMore();
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // 
            String nowTime = df.format(new Date(System.currentTimeMillis()));
            // 
            xlistview.setRefreshTime(nowTime);
        }
    }, 2000);
}
//加载更多
@Override
public void onLoadMore() {
    new Thread(){
        @Override
        public void run() {
            super.run();
            try {
                getdataflush();
                getActivity().runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        adapter.notifyDataSetChanged();
                    }
                });
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }.start();
    onLoad();
}
protected void getdataflush() {
    pageIndex=pageIndex+1;
    Gson gson=new Gson();
    MyData myData = gson.fromJson(str, MyData.class);
    List<Datas> data = myData.data;
    list.addAll(data);
}

四、补充HttpUtils的Bean

package com.bwie.vo;

import java.io.Serializable;
import java.util.List;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias(“oschina”)
public class Bean implements Serializable{
public String tweetCount;
public String pagesize;
@XStreamAlias(“tweets”)
public Tweets tweets;
public static class Tweets implements Serializable{
@XStreamImplicit(itemFieldName=”tweet”)
public List tweet;
public static class Tweet implements Serializable{
public String id;
public String portrait;
public String author;
public String authorid;
public String body;
public String attach;
public String appclient;
public String commentCount;
public String pubDate;
public String imgSmall;
public String imgBig;
public String likeCount;
public String isLike;
public String likeList;
}
}
}

03-19
### IEEE 802.1Q VLAN Tagging Protocol Standard IEEE 802.1Q 是支持虚拟局域网(VLAN)的标准协议之一,通常被称为 Dot1q。该标准定义了一种用于以太网帧的 VLAN 标记系统以及交换机和桥接器处理这些标记帧的操作流程[^2]。 #### 协议结构概述 IEEE 802.1Q 的核心功能在于通过在以太网数据帧中插入特定字段来实现 VLAN 标签的功能。这种标签使得网络设备能够识别哪些流量属于哪个 VLAN,并据此执行转发决策。具体来说: - **Tag Header**: 在原始以太网帧头部增加了一个额外的 4 字节字段作为 VLAN 标签头。这四个字节包含了以下部分: - **Priority Code Point (PCP)**: 使用 3 比特表示优先级级别,范围从 0 到 7,主要用于 QoS 控制。 - **Canonical Format Indicator (CFI)**: 这是一个单比特位,在传统以太网环境中设置为零。 - **VLAN Identifier (VID)**: 使用 12 比特标识具体的 VLAN ID,理论上可以支持多达 4096 个不同的 VLAN(编号从 0 至 4095),其中某些特殊值保留给内部用途或管理目的。 #### 数据包处理机制 当一个带有 VLAN tag 的数据包进入支持 IEEE 802.1Q 的交换机时,它会依据此标签决定如何路由或者过滤该数据流。如果目标端口不属于同一 VLAN,则不会传输至其他无关联的物理接口上;反之亦然——只有相同 VLAN 成员之间才允许互相通信除非经过路由器跨网段访问[^1]。 此外,为了简化管理和配置过程并增强互操作性,还引入了一些辅助性的子协议和服务组件比如 GARP(通用属性注册协议)。GARP 可帮助分发有关 VLAN 成员资格的信息到各个连接节点以便动态调整其行为模式而无需频繁手动干预[^3]。 以下是创建带 VLAN TAG 的 Python 示例代码片段展示如何模拟构建这样的 Ethernet Frame: ```python from scapy.all import Ether, Dot1Q, IP, sendp def create_vlan_packet(src_mac="00:aa:bb:cc:dd:ee", dst_mac="ff:ff:ff:ff:ff:ff", vlan_id=100, src_ip="192.168.1.1", dst_ip="192.168.1.2"): ether = Ether(src=src_mac, dst=dst_mac) dot1q = Dot1Q(vlan=vlan_id) ip_layer = IP(src=src_ip, dst=dst_ip) packet = ether / dot1q / ip_layer return packet packet = create_vlan_packet() sendp(packet, iface="eth0") # Replace 'eth0' with your network interface name. ``` 上述脚本利用 Scapy 库生成包含指定源地址、目的地址及所属 VLAN 编号的数据报文并通过选定的网卡发送出去测试实际效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值