ListView上拉加载更多

来源:互联网 发布:福建广电网络人工电话 编辑:程序博客网 时间:2024/04/20 01:38
1.首先重写listview,给其加上底部的view


public class ListView_foot extends ListView implements AbsListView.OnScrollListener{
    private int state;//状态值

    /**
     * 自己定义的两个状态,加载状态LOADING,和加载完后的状态GONE
     */
    private final int LOADING=1;
    private final int GONE=2;

    private View footView;//所加在listview下面的view
    private boolean isRemark;

    private int sumItem;//页面显示的第一个item数加上这页item数量
    private int totalItem;//listview总的item数
    IReFlashListener iReFlashListener;

    //重写的构造方法
    public ListView_foot(Context context) {
        super(context);
        FootView(context);
    }
    public ListView_foot(Context context, AttributeSet attrs) {
        super(context, attrs);
        FootView(context);
    }
    public ListView_foot(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        FootView(context);
    }
    @Override

    public void onScrollStateChanged(AbsListView view, int scrollState) {

//这里表示滑到底部的时候且屏幕停止滚动

         if(totalItem==sumItem && scrollState==SCROLL_STATE_IDLE){
            if(!isRemark){
                isRemark=true;
                state=LOADING;
                ViewChangedByState(state);
                iReFlashListener.onReFlash();//这里是刷新数据的关键
            }
        }
    }
    //监听频幕滚动生成的方法
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                         int totalItemCount) {
        sumItem=firstVisibleItem+visibleItemCount;
        totalItem=totalItemCount;
    }
    private void FootView(Context context){
        LayoutInflater inflater= LayoutInflater.from(context);
        //想加什么样的底部可以自己布局
        footView=inflater.inflate(R.layout.foot_layout,null);
        this.addFooterView(footView);//将footView加到listView的底部
    }
    private void ViewChangedByState(int state){
        switch (state){
            case LOADING:
                //这个状态下 footview显示
                this.footView.setVisibility(View.VISIBLE);
                this.footView.setPadding(0, 0, 0, 0);
                break;
            case GONE:
                //这个状态下 footview隐藏
                this.footView.setVisibility(View.GONE);
                //将隐藏的footView向下移动footView.getHeight()的距离
                this.footView.setPadding(0, -footView.getHeight(), 0, 0);
                break;
        }
    }
    //加载完后调用的方法
    public void refreshComplete(){
        state=GONE;
        ViewChangedByState(state);
    }
    public void setInterface(IReFlashListener iReFlashListener){
        this.iReFlashListener=iReFlashListener;
    } 
    /**
     * 刷新数据的接口
     */
    public interface IReFlashListener{
        public void onReFlash();
    }
}


2.在自己的所需的Activity里面调用


public class MainActivity extends Activity implements ListView_foot.IReFlashListener{


    private ListView_foot listView;//注意这里是导入的重写的listview
    private SimpleAdapter simpleAdapter;
    private List<Map<String,Object>>dataList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView=(ListView_foot)findViewById(R.id.listView);
        dataList=new ArrayList<Map<String,Object>>();
        listView.setInterface(this);
        for(int i=0;i<40;i++){
            Map<String,Object>map=new HashMap<>();
            map.put("number",""+1);
            map.put("hello","hello world");
            dataList.add(map);
        }
        simpleAdapter=new SimpleAdapter(this,dataList,R.layout.item,new String[]{"number","hello"},
                new int[]{R.id.text1,R.id.text2});
        listView.setAdapter(simpleAdapter);
    }
    @Override
    public void onReFlash() {
/**
 * 这里进行加载数据的对应操作
 * 加载完后,调用refreshComplete()方法
 */
        for(int i=0;i<3;i++){
            Map<String,Object>map=new HashMap<>();
            map.put("number",""+2);
            map.put("hello", "hello world");
            dataList.add(map);
        }
        //datalist改变后,使其在界面显示出来
        simpleAdapter.notifyDataSetChanged();
        listView.refreshComplete();
    }
}
3.注意一下listview所在的XML文件里面


 <com.example.user.myli.ListView_foot
<----这里是重写的listview所在的包加上重写的名---->
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/listView"
        />


由于所写的小demo没有从网上取数据,获得数据的时间太短,会造成你看不到listview下面
的加载view,但真正涉及到网络的时候,是会显示的,亲测!!!
0 0
原创粉丝点击