ListView下拉刷新SwipeRefreshLayout + 底部加载

来源:互联网 发布:seo整站优化效果 编辑:程序博客网 时间:2024/05/01 22:00

1下拉刷新可以调用google官网定义的下拉控件SwipeRefreshLayout。

1.第一步 添加布局

<android.support.v4.widget.SwipeRefreshLayout        android:id="@+id/id_swipe_ly"        android:layout_width="match_parent"        android:layout_height="match_parent">        <ListView            android:id="@+id/two_a_list"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:background="#fff"            android:divider="@color/hui_f1"            android:dividerHeight="10dp"></ListView>    </android.support.v4.widget.SwipeRefreshLayout>

2.实现接口 与 实现方法

implements SwipeRefreshLayout.OnRefreshListener @Override    public void onRefresh() {        mHandler.sendEmptyMessageDelayed(0x11, 1000);    }

3.声明对象

private SwipeRefreshLayout mSwipeLayout;
    4.
mSwipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.id_swipe_ly);        mSwipeLayout.setOnRefreshListener(this);        mSwipeLayout.setColorSchemeColors(Color.RED, Color.RED);

5 在listview中需要控制位在顶部刷新

list.setOnScrollListener(new AbsListView.OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {                if (firstVisibleItem == 0) {//到顶部了                    mSwipeLayout.setEnabled(true);                    two_list_foot_view_rel_layout.setVisibility(View.GONE);                } else if (visibleItemCount + firstVisibleItem == totalItemCount) {        //到底部了                    mSwipeLayout.setEnabled(false);                   mHandler.sendEmptyMessageDelayed(0x12, 1000);//handler发送消息消息  自动刷新                } else {//在中间                    mSwipeLayout.setEnabled(false);                }            }        });    }

2 底部加载

原理: 给listview 添加FooterView 可设置为隐藏 可以通过list.setOnScrollListener方法知道listView已在底部,显示FooterView 并执行加载,加载成功后获得新数据与原有数据进行拼接 更新adapter 隐藏FooterView

1.添加FooterView

View footView = LayoutInflater.from(getActivity()).inflate(R.layout.two_list_foot_layout,null);        two_a_list.addFooterView(footView);

2 list.setOnScrollListener

list.setOnScrollListener(new AbsListView.OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {                if (firstVisibleItem == 0) {//到顶部了                    mSwipeLayout.setEnabled(true);                    two_list_foot_view_rel_layout.setVisibility(View.GONE);                } else if (visibleItemCount + firstVisibleItem == totalItemCount) {        //到底部了                    mSwipeLayout.setEnabled(false);                   mHandler.sendEmptyMessageDelayed(0x12, 1000);//handler发送消息消息  自动刷新                } else {//在中间                    mSwipeLayout.setEnabled(false);                }            }        });    }// handler处接收消息private Handler mHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {                case 0x11:                    adapter.notifyDataSetChanged();                    mSwipeLayout.setRefreshing(false);                    ToastUtil.showToast(getActivity(),"已刷新");                    break;                case 0x12:                    two_list_foot_view_rel_layout.setVisibility(View.GONE);                    ToastUtil.showToast(getActivity(),"加载更多");                    break;            }        }

3 数据拼接

原理 判断是否为第一次加载adapter 如果是这 new adapter 如果是底部加载获得的新数据这进行拼接 更新

        DongtaiBeans dongtaiBeans = new DongtaiBeans(jsonObject); // 解析json 获得javaBean        pageNum = Integer.valueOf(dongtaiBeans.getPage());   // 获取总过页数  通过此判断是否加载        if (mRefreshHeadFlag) {            adapter = null;                 // adapter是否为空        }        if (adapter == null) {                  // adapter为空 new adapter             detailInfos = dongtaiBeans.getZxdtlist();              adapter = new DongtaiListAdapter(detailInfos);            listView.setAdapter(adapter);    // 设置adapter         } else {                                 // adapter不为空             detailInfos.addAll(dongtaiBeans.getZxdtlist());    //  数据源拼接数据            adapter.notifyDataSetChanged();             //  更新数据        }

3 完整代码

<?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="match_parent"    android:background="#fff"    android:orientation="vertical">    <com.lpf.lpf.refresh.PullToRefreshView        android:id="@+id/main_pull_refresh_view"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">        <ListView            android:id="@+id/two_a_list"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:background="#fff"            android:divider="@color/hui_f1"            android:dividerHeight="10dp"></ListView>    </com.lpf.lpf.refresh.PullToRefreshView></LinearLayout>footer  布局 <?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="match_parent"    android:orientation="vertical">    <RelativeLayout        android:id="@+id/two_list_foot_view_rel_layout"        android:layout_width="match_parent"        android:layout_height="40dp"        android:background="#f1f1f1">        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true"            android:text="正在加载"            android:textColor="#696969"            android:textSize="16sp" />    </RelativeLayout></LinearLayout>package com.taisheng.xiaofang.com.taisheng.xiaofang.two;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.support.v4.app.Fragment;import android.support.v4.widget.SwipeRefreshLayout;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.FrameLayout.LayoutParams;import android.widget.ListView;import android.widget.RelativeLayout;import android.widget.TextView;import com.lpf.lpf.net.AsyncTaskJsonUtil;import com.lpf.lpf.net.ThreadJsonUtils;import com.lpf.lpf.refresh.PullToRefreshView;import com.lpf.lpf.utils.ToastUtil;import com.taisheng.xiaofang.R;import org.json.JSONObject;import java.util.ArrayList;import java.util.List;public class AFrag extends Fragment implements SwipeRefreshLayout.OnRefreshListener {    private View view;    private int mWidth;    private ListView two_a_list;    private List<String> list;    private boolean mRefreshHeadFlag = true;// 判断是否刷新的是头部    private boolean mRefreshFlag = false;// 判断是否刷新    private int pageNum;    private List<String> detailInfos;    private SwipeRefreshLayout mSwipeLayout;    private  MyShouyeListAdapter adapter;    private RelativeLayout two_list_foot_view_rel_layout;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        view = inflater.inflate(R.layout.two_a, container, false);        mWidth = getResources().getDisplayMetrics().widthPixels;        initView();        initData();        return view;    }    private void initView() {        mSwipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.id_swipe_ly);        mSwipeLayout.setOnRefreshListener(this);        mSwipeLayout.setColorSchemeColors(Color.RED, Color.RED);        two_a_list = (ListView) view.findViewById(R.id.two_a_list);        two_a_list.setFocusable(false);        View footView = LayoutInflater.from(getActivity()).inflate(R.layout.two_list_foot_layout,null);        two_a_list.addFooterView(footView);        two_list_foot_view_rel_layout = (RelativeLayout) footView.findViewById(R.id.two_list_foot_view_rel_layout);        two_a_list.setOnScrollListener(new AbsListView.OnScrollListener() {            @Override            public void onScrollStateChanged(AbsListView view, int scrollState) {            }            @Override            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {                if (firstVisibleItem == 0) {//到顶部了                    mSwipeLayout.setEnabled(true);                    two_list_foot_view_rel_layout.setVisibility(View.GONE);                } else if (visibleItemCount + firstVisibleItem == totalItemCount) {        //到底部了                    mSwipeLayout.setEnabled(false);                    two_list_foot_view_rel_layout.setVisibility(View.VISIBLE);                    mHandler.sendEmptyMessageDelayed(0x12, 1000);                } else {//在中间                    mSwipeLayout.setEnabled(false);                    two_list_foot_view_rel_layout.setVisibility(View.VISIBLE);                }            }        });    }    private void initData() {        list = new ArrayList<>();        String path = URLson.最新动态+"?pagenum=1";        AsyncTaskJsonUtil jsonUtil = new AsyncTaskJsonUtil(getActivity(), null,                null, false, null, true, "请稍等......", new AsyncTaskJsonUtil.ResultCallBack() {            @Override            public void JSONResult(JSONObject jsonObject) {                // TODO Auto-generated method stub                DongtaiBeans dongtaiBeans = new DongtaiBeans(jsonObject);                pageNum = Integer.valueOf(dongtaiBeans.getPage());                if (mRefreshHeadFlag) {                    adapter = null;                }                if (adapter == null) {                    detailInfos = dongtaiBeans.getZxdtlist();                    adapter =  new MyShouyeListAdapter(list);                    two_a_list.setAdapter(adapter);                } else {                    detailInfos.addAll(dongtaiBeans.getZxdtlist());                    adapter.notifyDataSetChanged();                }            }        });        jsonUtil.execute(path);    }    private Handler mHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {                case 0x11:                    adapter.notifyDataSetChanged();                    mSwipeLayout.setRefreshing(false);                    ToastUtil.showToast(getActivity(),"已刷新");                    break;                case 0x12:                    two_list_foot_view_rel_layout.setVisibility(View.GONE);                    ToastUtil.showToast(getActivity(),"加载更多");                    break;            }        }        ;    };    @Override    public void onRefresh() {        mHandler.sendEmptyMessageDelayed(0x11, 1000);    }    class MyShouyeListAdapter extends BaseAdapter {        List<String> list;        public MyShouyeListAdapter(List<String> list) {            this.list = list;        }        @Override        public int getCount() {            return list.size();        }        @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 viewGroup) {            ViewHolder holder;            if (convertView == null) {                holder = new ViewHolder();                convertView = LayoutInflater.from(getActivity()).inflate(R.layout.two_a_list_item_layout, null);                convertView.setTag(holder);            } else {                holder = (ViewHolder) convertView.getTag();            }            return convertView;        }        class ViewHolder {        }    }}
1 0