PullToRefreshListView第三方的自定义listview用起来很方便,但是有时候我们需要为这个listview添加头,由于PullToRefreshListView没有.addHeaderView方法

这时候添加头,就有点犯难了。其实加头只需要一句简单的代码就行

我们为第三方的PullToRefresh添加头部的方法

由于PullToRefreshListView没有直接添加头布局的方法,所以我们需要用refreshListView.getRefreshableView()把refreshListView
转化成正常的listview,转化后的listview才可以添加头布局。

private PullToRefreshListView refreshListView;
private ListView listView;
listView = refreshListView.getRefreshableView();
 listView .addHeaderView(headerView);

下面两个例子分别为activity和fragment中的PullToRefresh添加头

一:在activity中为PullToRefresh添加头

  1. package com.huxiu.yd;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.BaseAdapter;
  6. import android.widget.FrameLayout;
  7. import android.widget.ImageView;
  8. import android.widget.LinearLayout;
  9. import android.widget.ListView;
  10. import android.widget.TextView;
  11. import com.android.volley.Request;
  12. import com.android.volley.Response;
  13. import com.android.volley.VolleyError;
  14. import com.handmark.pulltorefresh.library.PullToRefreshBase;
  15. import com.handmark.pulltorefresh.library.PullToRefreshListView;
  16. import com.huxiu.yd.net.GsonRequest;
  17. import com.huxiu.yd.net.NetworkConstants;
  18. import com.huxiu.yd.net.NetworkHelper;
  19. import com.huxiu.yd.net.model.DiscoveryItem;
  20. import com.huxiu.yd.net.responses.DiscoveryListResponse;
  21. import com.huxiu.yd.utils.Utils;
  22. import com.makeramen.roundedimageview.RoundedImageView;
  23. import com.nostra13.universalimageloader.core.ImageLoader;
  24. import com.nostra13.universalimageloader.core.listener.PauseOnScrollListener;
  25. import java.util.ArrayList;
  26. import java.util.Collections;
  27. import java.util.LinkedHashMap;
  28. import java.util.List;
  29. import java.util.Map;
  30. import butterknife.ButterKnife;
  31. import butterknife.InjectView;
  32. public class JiFenActivity2 extends BaseActivity
  33. implements PullToRefreshBase.OnRefreshListener2<ListView>, View.OnClickListener {
  34. @InjectView(R.id.back)
  35. ImageView back;
  36. @InjectView(R.id.title)
  37. TextView title;
  38. @InjectView(R.id.right_text)
  39. TextView rightText;
  40. FrameLayout qiandao_frame;
  41. RoundedImageView qiandao_bg;
  42. LinearLayout qiandao_ok;
  43. LinearLayout qiandao_no;
  44. TextView jifen_num;
  45. @InjectView(R.id.list_out)
  46. PullToRefreshListView list_out;
  47. ListView list;  
    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3. super.onCreate(savedInstanceState);
    4. setContentView(R.layout.activity_ji_fen2);
    5. ButterKnife.inject(this);
    6. View headerView = View.inflate(getApplicationContext(), R.layout.list_mine_header,
    7. null);
    8. qiandao_frame = (FrameLayout) headerView.findViewById(R.id.qiandao_frame);
    9. qiandao_bg = (RoundedImageView) headerView.findViewById(R.id.qiandao_bg);
    10. qiandao_ok = (LinearLayout) headerView.findViewById(R.id.qiandao_ok);
    11. qiandao_no = (LinearLayout) headerView.findViewById(R.id.qiandao_no);
    12. list = list_out.getRefreshableView();
    13. list.setDividerHeight(0);// 隐藏listview默认的divider
    14. list.setSelector(android.R.color.transparent);// 隐藏listview默认的selector
    15. rightText.setVisibility(View.VISIBLE);
    16. rightText.setText(R.string.shuoming);
    17. rightText.setTextColor(0xffffffff);
    18. back.setOnClickListener(this);
    19. rightText.setOnClickListener(this);
    20. qiandao_frame.setOnClickListener(this);
    21. title.setText(R.string.myjifen);
    22. list.addHeaderView(headerView);
    23. list_out.setOnRefreshListener(this);
    24. list_out.setState(PullToRefreshBase.State.INIT_REFRESHING, true);
    25. PauseOnScrollListener listener = new PauseOnScrollListener(ImageLoader.getInstance(), false,
    26. true);
    27. list_out.setOnScrollListener(listener);
    28. adapter = new MyAdapter();
    29. list.setAdapter(adapter);
    30. }
    31. @Override
    32. public void onPullDownToRefresh(PullToRefreshBase refreshView) {
    33. getItems(1);
    34. }
    35. @Override
    36. public void onPullUpToRefresh(PullToRefreshBase refreshView) {
    37. getItems(currentPage + 1);
    38. }
    39. private void refreshComplete() {
    40. list_out.postDelayed(new Runnable() {
    41. @Override
    42. public void run() {
    43. list_out.onRefreshComplete();
    44. }
    45. }, 100);
    46. }
    47. @Override
    48. protected void onDestroy() {
    49. super.onDestroy();
    50. ButterKnife.reset(this);
    51. NetworkHelper.getInstance().getRequestQueue().cancelAll(this);
    52. }
    53. @Override
    54. public void onClick(View v) {
    55. switch (v.getId()) {
    56. case R.id.qiandao_frame:
    57. Utils.showToast("点击旋转动画");
    58. break;
    59. case R.id.back:
    60. finish();
    61. break;
    62. case R.id.right_text:
    63. Utils.showToast("跳到积分页面");
    64. break;
    65. }
    66. }
    67. private int totalPages = 0;
    68. private int currentPage = 0;
    69. private List<DiscoveryItem> items = new ArrayList<>();
    70. private void getItems(final int page) {
    71. String url = NetworkConstants.ACTION_URL;
    72. Map<String, String> params = new LinkedHashMap<>();
    73. params.put("act", "credits_log");
    74. params.put("page", Integer.toString(page));
    75. GsonRequest<DiscoveryListResponse> request = new GsonRequest<>(url, Request.Method.POST,
    76. DiscoveryListResponse.class, true, params, new Response.Listener<DiscoveryListResponse>() {
    77. @Override
    78. public void onResponse(DiscoveryListResponse response) {
    79. if (response.isSuccess()) {
    80. if (page == 1 || page == 0) {
    81. items.clear();
    82. }
    83. if (list_out != null) {
    84. if (response.page == response.max_page) {
    85. list_out.setMode(PullToRefreshBase.Mode.PULL_FROM_START);
    86. } else {
    87. list_out.setMode(PullToRefreshBase.Mode.BOTH);
    88. }
    89. }
    90. Collections.addAll(items, response.data);
    91. adapter.notifyDataSetChanged();
    92. currentPage = response.page;
    93. } else {
    94. Utils.showToast(response.msg);
    95. }
    96. refreshComplete();
    97. }
    98. }, new Response.ErrorListener() {
    99. @Override
    100. public void onErrorResponse(VolleyError volleyError) {
    101. Utils.showToast(R.string.generic_failure);
    102. refreshComplete();
    103. }
    104. });
    105. NetworkHelper.getInstance().addToRequestQueue(request);
    106. }
    107. private MyAdapter adapter;
    108. class MyAdapter extends BaseAdapter {
    109. @Override
    110. public int getCount() {
    111. return items.size();
    112. }
    113. @Override
    114. public Object getItem(int position) {
    115. return items.get(position);
    116. }
    117. @Override
    118. public long getItemId(int position) {
    119. return 0;
    120. }
    121. @Override
    122. public View getView(int position, View convertView, ViewGroup parent) {
    123. ViewHolder vh;
    124. View v = convertView;
    125. if (v == null) {
    126. v = getLayoutInflater().inflate(R.layout.item_jifen_list, parent, false);
    127. vh = new ViewHolder(v);
    128. v.setTag(vh);
    129. }
    130. final DiscoveryItem item = items.get(position);
    131. vh = (ViewHolder) v.getTag();
    132. vh.jifen_type.setText(item.message);
    133. vh.jifen_time.setText(Utils.getDateString(item.create_time));
    134. vh.jifen_num.setText("+" + item.value);
    135. return v;
    136. }
    137. }
    138. class ViewHolder {
    139. @InjectView(R.id.jifen_type)
    140. TextView jifen_type;
    141. @InjectView(R.id.jifen_time)
    142. TextView jifen_time;
    143. @InjectView(R.id.jifen_num)
    144. TextView jifen_num;
    145. ViewHolder(View view) {
    146. ButterKnife.inject(this, view);
    147. }
    148. }
    149. }
    150. 上面activity的布局文件
      1. <?xml version="1.0" encoding="utf-8"?>
      2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3. xmlns:tools="http://schemas.android.com/tools"
      4. android:layout_width="match_parent"
      5. android:layout_height="match_parent"
      6. android:background="@color/white"
      7. android:orientation="vertical">
      8. <include
      9. android:id="@+id/header"
      10. layout="@layout/header"/>
      11. <com.handmark.pulltorefresh.library.PullToRefreshListView
      12. android:id="@+id/list_out"
      13. xmlns:ptr="http://schemas.android.com/apk/res-auto"
      14. android:layout_width="match_parent"
      15. android:layout_height="match_parent"
      16. android:divider="@null"
      17. android:footerDividersEnabled="false"
      18. android:listSelector="@android:color/transparent"
      19. ptr:ptrHeaderTextColor="@color/gray4"
      20. ptr:ptrMode="both"
      21. tools:listitem="@layout/discovery_list_item"/>
      22. </LinearLayout>
      23. 二,在fragment中为PullToRefresh添加头
        1. package com.shitou.googleplay.ui.fragment;
        2. import java.util.ArrayList;
        3. import org.json.JSONArray;
        4. import org.json.JSONException;
        5. import org.json.JSONObject;
        6. import android.content.Intent;
        7. import android.os.Handler;
        8. import android.support.v4.view.ViewPager;
        9. import android.text.TextUtils;
        10. import android.view.View;
        11. import android.widget.AdapterView;
        12. import android.widget.AdapterView.OnItemClickListener;
        13. import android.widget.LinearLayout.LayoutParams;
        14. import android.widget.ListView;
        15. import com.handmark.pulltorefresh.library.PullToRefreshBase;
        16. import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
        17. import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
        18. import com.handmark.pulltorefresh.library.PullToRefreshListView;
        19. import com.googleplay.R;
        20. import com.shitou.googleplay.bean.AppInfo;
        21. import com.shitou.googleplay.bean.Home;
        22. import com.shitou.googleplay.http.HttpHelper;
        23. import com.shitou.googleplay.http.Url;
        24. import com.shitou.googleplay.ui.activity.AppDetailActivity;
        25. import com.shitou.googleplay.ui.adapter.HomeAdapter;
        26. import com.shitou.googleplay.ui.adapter.HomePagerAdapter;
        27. import com.shitou.googleplay.util.CommonUtil;
        28. import com.shitou.googleplay.util.JsonUtil;
        29. import com.shitou.googleplay.util.LogUtil;
        30. public class HomeFragment extends BaseFragment {
        31. private PullToRefreshListView refreshListView;
        32. private ViewPager homePager;
        33. private HomeAdapter homeAdapter;
        34. private ArrayList<AppInfo> list = new ArrayList<AppInfo>();
        35. private ListView listView;
        36. private HomePagerAdapter homePagerAdapter;
        37. private Handler handler = new Handler(){
        38. public void handleMessage(android.os.Message msg) {
        39. homePager.setCurrentItem(homePager.getCurrentItem()+1);
        40. handler.sendEmptyMessageDelayed(0, 3000);
        41. };
        42. };
        43. @Override
        44. protected View getSuccessView() {
        45. initRefreshListView();//初始化PullToRefreshListView
        46. initHeaderView();//添加头部的ViewPager
        47. //设置Adapter
        48. homeAdapter = new HomeAdapter(list);
        49. listView.setAdapter(homeAdapter);
        50. return refreshListView;
        51. }
        52. /**
        53. * 初始化PullToRefreshListView
        54. */
        55. private void initRefreshListView() {
        56. // 1.初始化refreshListView,并且给它设置刷新监听
        57. refreshListView = (PullToRefreshListView) View.inflate(getActivity(),
        58. R.layout.ptr_listview, null);
        59. refreshListView.setMode(Mode.BOTH);// 设置两边都可以啦
        60. refreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
        61. /**
        62. * 上拉刷新和下拉加载更多都会执行该方法
        63. *
        64. * @param refreshView
        65. */
        66. @Override
        67. public void onRefresh(PullToRefreshBase<ListView> refreshView) {
        68. if (refreshListView.getCurrentMode() == Mode.PULL_FROM_START) {
        69. // 下拉刷新
        70. CommonUtil.runOnUIThread(new Runnable() {
        71. @Override
        72. public void run() {
        73. refreshListView.onRefreshComplete();// 完成刷新的方法
        74. }
        75. });
        76. } else {
        77. // 上拉加载更多,应该加载下一页的数据
        78. contentPage.loadDataAndRefreshPage();
        79. }
        80. }
        81. });
        82. listView = refreshListView.getRefreshableView();
        83. listView.setDividerHeight(0);// 隐藏listview默认的divider
        84. listView.setSelector(android.R.color.transparent);// 隐藏listview默认的selector
        85. //给listView增加item点击事件
        86. listView.setOnItemClickListener(new OnItemClickListener() {
        87. @Override
        88. public void onItemClick(AdapterView<?> parent, View view,
        89. int position, long id) {
        90. // LogUtil.e(this, "position:"+position);
        91. Intent intent = new Intent(getActivity(),AppDetailActivity.class);
        92. intent.putExtra("packageName",list.get(position-2).getPackageName());
        93. startActivity(intent);
        94. }
        95. });
        96. }
        97. /**
        98. * 初始化headerView
        99. */
        100. private void initHeaderView(){
        101. View headerView = View.inflate(getActivity(), R.layout.layout_home_pager, null);
        102. homePager = (ViewPager) headerView.findViewById(R.id.homePager);
        103. //1.计算出ViewPager的宽度
        104. float width = getActivity().getWindowManager().getDefaultDisplay().getWidth();
        105. //2.根据图片的宽高比,计算出对应的高度,宽高比是2.65
        106. float height = width/2.65f;
        107. //3.将计算出来的高度重新赋值给VIewPager的高度
        108. LayoutParams layoutParams = (LayoutParams) homePager.getLayoutParams();
        109. layoutParams.height = (int) height;//重新给布局参数设置
        110. homePager.setLayoutParams(layoutParams);
        111. // homePager.requestLayout();//也可以这样写
        112. listView.addHeaderView(headerView);
        113. }
        114. @Override
        115. protected Object requestData() {
        116. String result = HttpHelper.get(Url.Home + list.size());
        117. final Home home = JsonUtil.parseJsonToBean(result, Home.class);
        118. if (home != null) {
        119. // 更新数据
        120. list.addAll(home.getList());
        121. CommonUtil.runOnUIThread(new Runnable() {
        122. @Override
        123. public void run() {
        124. //由于轮播图的url数据,只有在加载第一页的时候才有,
        125. if(home.getPicture()!=null && home.getPicture().size()>0){
        126. //表明是第一页加载数据,此时是有轮播图url的数据
        127. homePagerAdapter = new HomePagerAdapter(home.getPicture());
        128. homePager.setAdapter(homePagerAdapter);
        129. //一开始设置选中的是中间的item
        130. homePager.setCurrentItem(home.getPicture().size()*10000);
        131. }
        132. // 更新adapter
        133. homeAdapter.notifyDataSetChanged();
        134. // 完成刷新
        135. refreshListView.onRefreshComplete();// 完成刷新的方法
        136. }
        137. });
        138. }
        139. return home;
        140. }
        141. @Override
        142. public void onStart() {
        143. super.onStart();
        144. //发送延时消息
        145. handler.sendEmptyMessageDelayed(0, 3000);
        146. }
        147. @Override
        148. public void onStop() {
        149. super.onStop();
        150. //移除消息
        151. handler.removeCallbacksAndMessages(null);
        152. }
        153. /**
        154. * 使用JSONObject解析json
        155. *
        156. * @param json
        157. * @return
        158. */
        159. private Home parseJson(String json) {
        160. if (TextUtils.isEmpty(json))
        161. return null;
        162. Home home = new Home();
        163. try {
        164. JSONObject jsonObject = new JSONObject(json);
        165. // 1.解析picture字段
        166. ArrayList<String> picture = new ArrayList<String>();
        167. JSONArray pictureArray = jsonObject.getJSONArray("picture");
        168. for (int i = 0; i < pictureArray.length(); i++) {
        169. String string = pictureArray.getString(i);
        170. picture.add(string);
        171. }
        172. home.setPicture(picture);
        173. // 2.解析list字段
        174. ArrayList<AppInfo> list = new ArrayList<AppInfo>();
        175. JSONArray listArray = jsonObject.getJSONArray("list");
        176. for (int i = 0; i < listArray.length(); i++) {
        177. JSONObject object = listArray.getJSONObject(i);
        178. AppInfo appInfo = new AppInfo();
        179. appInfo.setDes(object.getString("des"));
        180. appInfo.setDownloadUrl(object.getString("downloadUrl"));
        181. appInfo.setIconUrl(object.getString("iconUrl"));
        182. appInfo.setId(object.getInt("id"));
        183. appInfo.setName(object.getString("name"));
        184. appInfo.setPackageName(object.getString("packageName"));
        185. appInfo.setSize(object.getLong("size"));
        186. appInfo.setStars((float) object.getDouble("stars"));
        187. list.add(appInfo);
        188. }
        189. home.setList(list);
        190. } catch (JSONException e) {
        191. e.printStackTrace();
        192. }
        193. return home;
        194. }
        195. }

转载于:https://www.cnblogs.com/Dionexin/p/5821323.html

安卓中PullToRefresh添加头布局的方法相关推荐

  1. 计算机excel怎么添加实线边框,Excel中自动添加边框线条的方法!学会效率翻倍!你确定不学?...

    原标题:Excel中自动添加边框线条的方法!学会效率翻倍!你确定不学? 平常大家在工作中,有时候是不是需要给Excel表格加上边框啊?那么今天我们就来聊聊Excel表格添加边框线条那些事. 大家给Ex ...

  2. IDEA中快速添加自己自定义的方法方法,想要什么快捷方法都行

    IDEA中快速添加自己自定义的方法方法,想要什么快捷方法都行 作为一个从MyEclipse转IDEA的程序员,原来写main就能补全main方法,写syso就能补全System.out.println ...

  3. vue改变class名字_vue中动态添加class类名的方法

    vue 动态添加class类名,灵活得让你发狂,下面示例几个 动态添加类名 文字的颜色) 文字的颜色) 三元表示式(文字的颜色) 文字的颜色) 文字的颜色) 通过方法设置class类名 export ...

  4. 如何保存php网页到桌面,php中网页添加到桌面快捷方式方法

    摘要 腾兴网为您分享:php中网页添加到桌面快捷方式方法,小度音响,先锋影音,趣分期,七猫小说等软件知识,以及魔兽争霸显血,illustrator,abc看图,速算练习,携程抢票软件,魔兽仙剑奇侠传, ...

  5. GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合

    此贴为标记贴 方便下次使用 在项目需求中原本是用ScrollView来进行整个页面的滑动,ScrollView里面包含的有图片轮播,文字轮播,与2列GridView的item 问题 使用原生的Grid ...

  6. 【IAR】IAR for MSP430添加头文件的方法

    一.问题由来   在使用IAR for MSP 430编译代码时,用户为了方便管理文件,会将编写的.c和.h头文件存放在不同的路径下,这个路径是用户自定义的路径,因此我们不能直接在main.c文件中直 ...

  7. Android开发之listview添加头布局(header)和脚布局(footer)的方法

    我们先说下添加的方法 方法一:正常添加lvCouponList.addHeaderView(headerView);lvCouponList.addFooterView(footerView); 方法 ...

  8. 在安卓中压缩GIF的几种方法(附实例代码)

    前言 最近在划水摸鱼的时候,看到有位大佬发了一篇 GIF 压缩思路的文章. 让我突然想起来,很久以前我在我的项目 隐云图解制作 中就实现了一个动图工具箱,其中一个功能就是压缩GIF. 不过这位大佬只介 ...

  9. 安卓中动态生成界面布局

    在项目设计和安卓程序开发过程中有时候我们需要试用编程动态生成界面,这样的好处是可以先读取屏幕大小然后动态生成满足屏幕大小的程序,本例的程序最终实现效果如下:例子为一个点菜初界面,左右滑动手指可以实现菜 ...

最新文章

  1. python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)
  2. 为什么对高斯分布的方差的极大似然估计是有偏的?
  3. FCN、Unet、Unet++:医学图像分割网络一览
  4. Andrew Ng 深度学习课后测试记录-01-week2-答案
  5. ppt设置外观样式_如何设置更符合需要的幻灯片背景?
  6. quartz 表说明
  7. 报错:“-bash: git: 未找到命令”
  8. [Vue.js]实战 -- 电商项目(一)
  9. hive与hbase数据类型对应关系
  10. L1-055 谁是赢家-PAT团体程序设计天梯赛GPLT
  11. Windows7 64位下SDK Manager.exe无法运行问题解决方法
  12. 所有 HTTP 状态代码及其定义
  13. php excel自适应列宽,PHPExcel自动调整列宽
  14. android provision apk 分析
  15. 阿里云服务器和虚拟主机之间的区别
  16. 【思考题】新客老客定义
  17. format格式化输出
  18. VB-TabIndex、GotFocus、SetFocus
  19. 功能实现_实现指北针(UI图片)效果
  20. 十什么争什么的成语(十什么争什么四字成语大全)

热门文章

  1. 澎湃新闻网站全站新闻爬虫及各大新闻平台聚合爬虫发布
  2. 图神经网络-图与图学习笔记-1
  3. 在Vue中使用数字动画
  4. 【转帖】视频聊天网站的研究、发展以及趋势
  5. 淘客心得nbsp;PV是王道(原创)
  6. 摩根大通区块链支付网络计划于1月日本启动
  7. LDAP unexpected response: 500
  8. 创维电视显示连接服务器失败怎么回事,创维电视显示已连接路由器,却无法联网-创维电视连接路由器显示连接失败...
  9. python爬虫用urllib还是reques_Python爬虫之urllib.request库
  10. 06.破解Windows7密码