zoukankan      html  css  js  c++  java
  • 安卓中PullToRefresh添加头布局的方法

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