android 之下拉刷新

末蓝、 2023-10-10 08:00 109阅读 0赞

一.概述

Android 下拉刷新几乎是每个应用都必带的功能, 并且现在下拉刷新第三方库也越来越多了,很方便就能实现该功能, 下面我介绍一下 自己常用的几个方法.

二.例子

第一种方式:就是集成ListView实现自定义控件完成上下拉刷新

  1. public class PullToRefreshListView extends ListView implements OnScrollListener, OnClickListener {
  2. /**
  3. * 下拉状态
  4. */
  5. private static final int PULL_TO_REFRESH = 1; //下拉-默认为初始状态 准备下拉刷新
  6. private static final int RELEASE_TO_REFRESH = 2; //释放刷新
  7. private static final int REFRESHING = 3; //正在刷新
  8. private static final String TAG = "PullRefreshListView";
  9. private OnRefreshListener mOnRefreshListener;
  10. /**
  11. * 组件滑动监听器 scroll 当view在进行下拉滑动的时候,判断滑动的距离,
  12. * 如果达到可以进行刷新的临界点时候,回调当前接口中的方法
  13. * Listener that will receive notifications every time the list scrolls.
  14. */
  15. private OnScrollListener mOnScrollListener;
  16. //下拉刷新的的头部view
  17. private LinearLayout mRefreshView;
  18. private ImageView mRefreshViewImage;
  19. private ProgressBar mRefreshViewProgress;
  20. private TextView mRefreshViewText;
  21. private TextView mRefreshViewLastUpdated;
  22. private int mRefreshState;
  23. private int mCurrentScrollState;
  24. private RotateAnimation mFlipAnimation;
  25. private RotateAnimation mReverseFlipAnimation;
  26. private int mRefreshViewHeight;
  27. private int mRefreshOriginalTopPadding;
  28. private int mLastMotionY;
  29. public PullToRefreshListView(Context context) {
  30. super(context);
  31. init(context);
  32. }
  33. public PullToRefreshListView(Context context, AttributeSet attrs) {
  34. super(context, attrs);
  35. init(context);
  36. }
  37. private void init(Context context) {
  38. mFlipAnimation = new RotateAnimation(0, -180,
  39. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  40. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  41. mFlipAnimation.setInterpolator(new LinearInterpolator());
  42. mFlipAnimation.setDuration(250);
  43. mFlipAnimation.setFillAfter(true);
  44. mReverseFlipAnimation = new RotateAnimation(-180, 0,
  45. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  46. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  47. mReverseFlipAnimation.setInterpolator(new LinearInterpolator());
  48. mReverseFlipAnimation.setDuration(250);
  49. mReverseFlipAnimation.setFillAfter(true);
  50. mRefreshView = (LinearLayout) View.inflate(context, R.layout.pull_to_refresh_header, null);
  51. mRefreshViewText = (TextView) mRefreshView.findViewById(R.id.pull_to_refresh_text);
  52. mRefreshViewImage = (ImageView) mRefreshView.findViewById(R.id.pull_to_refresh_image);
  53. mRefreshViewProgress = (ProgressBar) mRefreshView.findViewById(R.id.pull_to_refresh_progress);
  54. mRefreshViewLastUpdated = (TextView) mRefreshView.findViewById(R.id.pull_to_refresh_updated_at);
  55. mRefreshState = PULL_TO_REFRESH;
  56. mRefreshViewImage.setMinimumHeight(50); //设置下拉最小的高度为50
  57. setFadingEdgeLength(0);
  58. setHeaderDividersEnabled(false);
  59. //把refreshview加入到listview的头部
  60. addHeaderView(mRefreshView);
  61. super.setOnScrollListener(this);
  62. mRefreshView.setOnClickListener(this);
  63. mRefreshView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
  64. mRefreshViewHeight = mRefreshView.getMeasuredHeight();
  65. mRefreshOriginalTopPadding = -mRefreshViewHeight;
  66. resetHeaderPadding();
  67. }
  68. /**
  69. * Set the listener that will receive notifications every time the list scrolls.
  70. *
  71. * @param l The scroll listener.
  72. */
  73. @Override
  74. public void setOnScrollListener(OnScrollListener l) {
  75. mOnScrollListener = l;
  76. }
  77. /**
  78. * 注册listview下拉刷新回到接口
  79. * Register a callback to be invoked when this list should be refreshed.
  80. *
  81. * @param onRefreshListener The callback to run.
  82. */
  83. public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
  84. mOnRefreshListener = onRefreshListener;
  85. }
  86. /**
  87. * 进行设置设置上一次更新的时候
  88. *
  89. * Set a text to represent when the list was last updated.
  90. * @param lastUpdated Last updated at.
  91. */
  92. public void setLastUpdated(CharSequence lastUpdated) {
  93. if (lastUpdated != null) {
  94. mRefreshViewLastUpdated.setVisibility(View.VISIBLE);
  95. mRefreshViewLastUpdated.setText(lastUpdated);
  96. } else {
  97. mRefreshViewLastUpdated.setVisibility(View.GONE);
  98. }
  99. }
  100. /**
  101. * touch事件处理
  102. * @param event
  103. * @return
  104. */
  105. @Override
  106. public boolean onTouchEvent(MotionEvent event) {
  107. final int y = (int) event.getY();
  108. switch (event.getAction()) {
  109. case MotionEvent.ACTION_DOWN:
  110. mLastMotionY = y;
  111. break;
  112. case MotionEvent.ACTION_MOVE:
  113. int offsetY = (int) event.getY();
  114. int deltY = Math.round(offsetY - mLastMotionY);
  115. mLastMotionY = offsetY;
  116. if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
  117. deltY = deltY / 2;
  118. mRefreshOriginalTopPadding += deltY;
  119. if (mRefreshOriginalTopPadding < -mRefreshViewHeight) {
  120. mRefreshOriginalTopPadding = -mRefreshViewHeight;
  121. }
  122. resetHeaderPadding();
  123. }
  124. break;
  125. case MotionEvent.ACTION_UP:
  126. //当手指抬开得时候 进行判断下拉的距离 ,如果>=临界值,那么进行刷洗,否则回归原位
  127. if (!isVerticalScrollBarEnabled()) {
  128. setVerticalScrollBarEnabled(true);
  129. }
  130. if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
  131. if (mRefreshView.getBottom() >= mRefreshViewHeight
  132. && mRefreshState == RELEASE_TO_REFRESH) {
  133. //准备开始刷新
  134. prepareForRefresh();
  135. } else {
  136. // Abort refresh
  137. resetHeader();
  138. }
  139. }
  140. break;
  141. }
  142. return super.onTouchEvent(event);
  143. }
  144. @Override
  145. public void onScroll(AbsListView view, int firstVisibleItem,
  146. int visibleItemCount, int totalItemCount) {
  147. if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL && mRefreshState != REFRESHING) {
  148. if (firstVisibleItem == 0) {
  149. if ((mRefreshView.getBottom() >= mRefreshViewHeight)
  150. && mRefreshState != RELEASE_TO_REFRESH) {
  151. mRefreshViewText.setText(R.string.pull_to_refresh_release_label_it);
  152. mRefreshViewImage.clearAnimation();
  153. mRefreshViewImage.startAnimation(mFlipAnimation);
  154. mRefreshState = RELEASE_TO_REFRESH;
  155. } else if (mRefreshView.getBottom() < mRefreshViewHeight
  156. && mRefreshState != PULL_TO_REFRESH) {
  157. mRefreshViewText.setText(R.string.pull_to_refresh_pull_label_it);
  158. mRefreshViewImage.clearAnimation();
  159. mRefreshViewImage.startAnimation(mReverseFlipAnimation);
  160. mRefreshState = PULL_TO_REFRESH;
  161. }
  162. }
  163. }
  164. if (mOnScrollListener != null) {
  165. mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
  166. }
  167. }
  168. @Override
  169. public void onScrollStateChanged(AbsListView view, int scrollState) {
  170. mCurrentScrollState = scrollState;
  171. if (mOnScrollListener != null) {
  172. mOnScrollListener.onScrollStateChanged(view, scrollState);
  173. }
  174. }
  175. /**
  176. * Sets the header padding back to original size.
  177. */
  178. private void resetHeaderPadding() {
  179. mRefreshView.setPadding(
  180. mRefreshView.getPaddingLeft(),
  181. mRefreshOriginalTopPadding,
  182. mRefreshView.getPaddingRight(),
  183. mRefreshView.getPaddingBottom());
  184. }
  185. public void prepareForRefresh() {
  186. if (mRefreshState != REFRESHING) {
  187. mRefreshState = REFRESHING;
  188. mRefreshOriginalTopPadding = 0;
  189. resetHeaderPadding();
  190. mRefreshViewImage.clearAnimation();
  191. mRefreshViewImage.setVisibility(View.GONE);
  192. mRefreshViewProgress.setVisibility(View.VISIBLE);
  193. mRefreshViewText.setText(R.string.pull_to_refresh_refreshing_label_it);
  194. onRefresh();
  195. }
  196. }
  197. private void resetHeader() {
  198. mRefreshState = PULL_TO_REFRESH;
  199. mRefreshOriginalTopPadding = -mRefreshViewHeight;
  200. resetHeaderPadding();
  201. mRefreshViewImage.clearAnimation();
  202. mRefreshViewImage.setVisibility(View.VISIBLE);
  203. mRefreshViewProgress.setVisibility(View.GONE);
  204. mRefreshViewText.setText(R.string.pull_to_refresh_pull_label_it);
  205. }
  206. /**
  207. * 开始回调刷新
  208. */
  209. public void onRefresh() {
  210. Log.d(TAG, "onRefresh");
  211. if (mOnRefreshListener != null) {
  212. mOnRefreshListener.onRefresh();
  213. }
  214. }
  215. /**
  216. * Resets the list to a normal state after a refresh.
  217. */
  218. public void onRefreshComplete() {
  219. Log.d(TAG, "onRefreshComplete");
  220. resetHeader();
  221. }
  222. @Override
  223. public void onClick(View v) {
  224. Log.d(TAG, "onClick");
  225. }
  226. /**
  227. * Interface definition for a callback to be invoked when list should be
  228. * refreshed.
  229. */
  230. public interface OnRefreshListener {
  231. /**
  232. * Called when the list should be refreshed.
  233. * <p>
  234. * A call to {
  235. @link PullToRefreshListView #onRefreshComplete()} is
  236. * expected to indicate that the refresh has completed.
  237. */
  238. public void onRefresh();
  239. }
  240. }

上面代码就完成了,上下拉刷新工作, 直接拷贝到工程无需任何修改就可使用

当然它还需一个”头布局”

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/pull_to_refresh_header"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content"
  6. android:background="#F3F3F3"
  7. android:orientation="vertical" >
  8. <RelativeLayout
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:paddingTop="23dip" >
  12. <LinearLayout
  13. android:id="@+id/pull_to_refresh_view"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_centerHorizontal="true"
  17. android:orientation="vertical" >
  18. <TextView
  19. android:id="@+id/pull_to_refresh_text"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_gravity="center"
  23. android:gravity="center"
  24. android:text="@string/pull_to_refresh_pull_label"
  25. android:textColor="#777777"
  26. android:textSize="16sp" />
  27. <TextView
  28. android:id="@+id/pull_to_refresh_updated_at"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:layout_gravity="center"
  32. android:gravity="center"
  33. android:text="@string/pull_to_refresh_updated_at"
  34. android:textColor="#999999"
  35. android:textSize="14sp" />
  36. </LinearLayout>
  37. <ProgressBar
  38. android:id="@+id/pull_to_refresh_progress"
  39. android:layout_width="30dip"
  40. android:layout_height="30dip"
  41. android:layout_marginRight="22dip"
  42. android:layout_marginTop="5dip"
  43. android:layout_toLeftOf="@+id/pull_to_refresh_view"
  44. android:indeterminate="true"
  45. android:indeterminateDrawable="@anim/ic_loading_refresh"
  46. android:visibility="gone" />
  47. <ImageView
  48. android:id="@+id/pull_to_refresh_image"
  49. android:layout_width="32dip"
  50. android:layout_height="32dip"
  51. android:layout_marginRight="20dip"
  52. android:layout_marginTop="5dip"
  53. android:layout_toLeftOf="@+id/pull_to_refresh_view"
  54. android:contentDescription="@string/app_name"
  55. android:gravity="center"
  56. android:src="@drawable/ic_refresh_down" />
  57. </RelativeLayout>
  58. <View
  59. android:layout_width="fill_parent"
  60. android:layout_height="15dip" />
  61. </LinearLayout>

此外代码中还用到了 时间的工具类: 如下

  1. public class SharedPreferencesHelper {
  2. private static final String SHARED_PATH = "fda_shared";
  3. private static SharedPreferencesHelper instance;
  4. private SharedPreferences sp;
  5. private SharedPreferences.Editor editor;
  6. public static SharedPreferencesHelper getInstance(Context context) {
  7. if (instance == null && context != null) {
  8. instance = new SharedPreferencesHelper(context);
  9. }
  10. return instance;
  11. }
  12. private SharedPreferencesHelper(Context context) {
  13. sp = context.getSharedPreferences(SHARED_PATH, Context.MODE_PRIVATE);
  14. editor = sp.edit();
  15. }
  16. public long getLongValue(String key) {
  17. if (key != null && !key.equals("")) {
  18. return sp.getLong(key, 0);
  19. }
  20. return 0;
  21. }
  22. public String getStringValue(String key) {
  23. if (key != null && !key.equals("")) {
  24. return sp.getString(key, null);
  25. }
  26. return null;
  27. }
  28. public int getIntValue(String key) {
  29. if (key != null && !key.equals("")) {
  30. return sp.getInt(key, 0);
  31. }
  32. return 0;
  33. }
  34. public int getIntValueByDefault(String key)
  35. {
  36. if (key != null && !key.equals("")) {
  37. return sp.getInt(key, 0);
  38. }
  39. return 0;
  40. }
  41. public boolean getBooleanValue(String key) {
  42. if (key != null && !key.equals("")) {
  43. return sp.getBoolean(key, false);
  44. }
  45. return true;
  46. }
  47. public float getFloatValue(String key) {
  48. if (key != null && !key.equals("")) {
  49. return sp.getFloat(key, 0);
  50. }
  51. return 0;
  52. }
  53. public void putStringValue(String key, String value) {
  54. if (key != null && !key.equals("")) {
  55. editor = sp.edit();
  56. editor.putString(key, value);
  57. editor.commit();
  58. }
  59. }
  60. public void putIntValue(String key, int value) {
  61. if (key != null && !key.equals("")) {
  62. editor = sp.edit();
  63. editor.putInt(key, value);
  64. editor.commit();
  65. }
  66. }
  67. public void putBooleanValue(String key, boolean value) {
  68. if (key != null && !key.equals("")) {
  69. editor = sp.edit();
  70. editor.putBoolean(key, value);
  71. editor.commit();
  72. }
  73. }
  74. public void putLongValue(String key, long value) {
  75. if (key != null && !key.equals("")) {
  76. editor = sp.edit();
  77. editor.putLong(key, value);
  78. editor.commit();
  79. }
  80. }
  81. public void putFloatValue(String key, Float value) {
  82. if (key != null && !key.equals("")) {
  83. editor = sp.edit();
  84. editor.putFloat(key, value);
  85. editor.commit();
  86. }
  87. }
  88. }
  89. public class SharedPreferencesTag {
  90. public static final String DEMO_KEY="demo_key";
  91. }
  92. public class UIUtils {
  93. /**
  94. * 设置上次更新数据时间
  95. * @param listView
  96. * @param key key表示具体某个列表
  97. */
  98. public static void setPullToRefreshLastUpdated(PullToRefreshListView listView, String key,Context pContext) {
  99. SharedPreferencesHelper spHelper = SharedPreferencesHelper.getInstance(pContext);
  100. long lastUpdateTimeStamp = spHelper.getLongValue(key);
  101. listView.setLastUpdated(getUpdateTimeString(lastUpdateTimeStamp));
  102. }
  103. /**
  104. * 保存更新数据时间
  105. * @param listView
  106. * @param key key表示具体某个列表
  107. */
  108. public static void savePullToRefreshLastUpdateAt(PullToRefreshListView listView, String key,Context pContext) {
  109. listView.onRefreshComplete();
  110. SharedPreferencesHelper spHelper = SharedPreferencesHelper.getInstance(pContext);
  111. long lastUpdateTimeStamp=System.currentTimeMillis();
  112. spHelper.putLongValue(key, lastUpdateTimeStamp);
  113. listView.setLastUpdated(getUpdateTimeString(lastUpdateTimeStamp));
  114. }
  115. /**
  116. * 更新时间字符串
  117. * @param timestamp
  118. * @return
  119. */
  120. @SuppressLint("SimpleDateFormat")
  121. public static String getUpdateTimeString(long timestamp) {
  122. if (timestamp <= 0) {
  123. return "上次更新时间:";
  124. } else {
  125. String textDate = "上次更新时间:";
  126. Calendar now = Calendar.getInstance();
  127. Calendar c = Calendar.getInstance();
  128. c.setTimeInMillis(timestamp);
  129. if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR)
  130. && c.get(Calendar.MONTH) == now.get(Calendar.MONTH)
  131. && c.get(Calendar.DATE) == now.get(Calendar.DATE)) {
  132. SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  133. return textDate += sdf.format(c.getTime());
  134. } else if (c.get(Calendar.YEAR) == now.get(Calendar.YEAR)) {
  135. SimpleDateFormat sdf = new SimpleDateFormat("MM/dd HH:mm");
  136. return textDate += sdf.format(c.getTime());
  137. } else {
  138. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
  139. return textDate += sdf.format(c.getTime());
  140. }
  141. }
  142. }
  143. }

这样就完成了, 测试效果图

538831-20160116142115866-1851539195.png

538831-20160116142122866-960747053.png

源码地址:https://yunpan.cn/cryrD4r7PIgWb (提取码:fcb1)

-———————————————————————————————————————————————————-

如果觉得上面的写法太麻烦,或者根本就不想自己写代码,那就用第三方库吧,PullToRefresh

使用步骤:

  1. https://github.com/cardview/Android-PullToRefresh 下载源码

  2. 解压下载文件, 把library 作为Module导入 Android studio

  3. 把该library 最为库,引入 自己工程中

引用文章:http://blog.csdn.net/hantangsongming/article/details/42490277

-———————————————————————————————————————————————————-

谷歌也推出了一种下拉刷新方式:

  1. SwipeRefreshLayout ,但是它只支持下拉刷新,并不支持 上拉加载更多

538831-20160120092555484-1307923683.png

  1. public class MainActivity extends AppCompatActivity {
  2. private RecyclerView demo_recycler;
  3. private LinearLayoutManager linearLayoutManager;
  4. private RefreshRecyclerAdpater adapter;
  5. private SwipeRefreshLayout demo_swiperefreshlayout;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. demo_recycler=(RecyclerView)this.findViewById(R.id.demo_recycler);
  11. linearLayoutManager=new LinearLayoutManager(this);
  12. linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
  13. demo_recycler.setLayoutManager(linearLayoutManager);
  14. demo_recycler.setAdapter(adapter = new RefreshRecyclerAdpater(this));
  15. demo_swiperefreshlayout=(SwipeRefreshLayout)this.findViewById(R.id.demo_swiperefreshlayout);
  16.      //这是设置圆圈背景色---白色
  17. demo_swiperefreshlayout.setProgressBackgroundColorSchemeColor(getResources().getColor(android.R.color.white));
  18.      //设置进度条颜色,最多可以设置4种,每转一圈变换一种颜色
  19. demo_swiperefreshlayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light, android.R.color.holo_orange_light);
  20. //设置圆圈距离顶部距离
  21. demo_swiperefreshlayout.setProgressViewOffset(false, 0, 50);
  22.      //模拟联网获取数据
  23. demo_swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  24. @Override
  25. public void onRefresh() {
  26. new Handler().postDelayed(new Runnable() {
  27. @Override
  28. public void run() {
  29. List<String> temp=new ArrayList<String>();
  30. for(int i=0;i<5;i++){
  31. temp.add("refresh item "+i);
  32. }
  33. adapter.addItem(temp);
  34. if(demo_swiperefreshlayout.isRefreshing()) {
  35. demo_swiperefreshlayout.setRefreshing(false);
  36. }
  37. }
  38. },5000);
  39. Toast.makeText(MainActivity.this,"下拉刷新",Toast.LENGTH_SHORT).show();
  40. }
  41. });
  42. }
  43. }

对应的RecyclerView 的adapter

  1. public class RefreshRecyclerAdpater extends RecyclerView.Adapter<RefreshRecyclerAdpater.ViewHolder>{
  2. private LayoutInflater mInflater;
  3. private List<String> mTitles=null;
  4. public RefreshRecyclerAdpater(Context context){
  5. this.mInflater=LayoutInflater.from(context);
  6. this.mTitles=new ArrayList<String>();
  7. for (int i=0;i<20;i++){
  8. int index=i+1;
  9. mTitles.add("item"+index);
  10. }
  11. }
  12. /**
  13. * item显示类型
  14. * @param parent
  15. * @param viewType
  16. * @return
  17. */
  18. @Override
  19. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  20. final View view=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
  21. //这边可以做一些属性设置,甚至事件监听绑定
  22. //view.setBackgroundColor(Color.RED);
  23. ViewHolder viewHolder=new ViewHolder(view);
  24. return viewHolder;
  25. }
  26. /**
  27. * 数据的绑定显示
  28. * @param holder
  29. * @param position
  30. */
  31. @Override
  32. public void onBindViewHolder(ViewHolder holder, int position) {
  33. holder.item_tv.setText(mTitles.get(position));
  34. holder.itemView.setTag(position);
  35. }
  36. @Override
  37. public int getItemCount() {
  38. return mTitles.size();
  39. }
  40. //自定义的ViewHolder,持有每个Item的的所有界面元素
  41. public static class ViewHolder extends RecyclerView.ViewHolder {
  42. public TextView item_tv;
  43. public ViewHolder(View view){
  44. super(view);
  45. item_tv = (TextView)view.findViewById(R.id.item_tv);
  46. }
  47. }
  48. //添加数据
  49. /**
  50. * 添加最新数据
  51. * @param newDatas
  52. */
  53. public void addItem(List<String> newDatas) {
  54. newDatas.addAll(mTitles);
  55. mTitles.removeAll(mTitles);
  56. mTitles.addAll(newDatas);
  57. notifyDataSetChanged();
  58. }
  59. }

布局文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.SwipeRefreshLayout
  3. android:id="@+id/demo_swiperefreshlayout"
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:scrollbars="vertical">
  8. <android.support.v7.widget.RecyclerView
  9. android:id="@+id/demo_recycler"
  10. android:layout_width="fill_parent"
  11. android:layout_height="fill_parent"
  12. >
  13. </android.support.v7.widget.RecyclerView>
  14. </android.support.v4.widget.SwipeRefreshLayout>

转载于:https://www.cnblogs.com/android-zcq/p/5135859.html

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

    相关 android 之下刷新

    一.概述 Android 下拉刷新几乎是每个应用都必带的功能, 并且现在下拉刷新第三方库也越来越多了,很方便就能实现该功能, 下面我介绍一下 自己常用的几个方法.   二

    相关 Android ListView下刷新

    ListView的重要性我就不多说了,下拉刷新的功能以前一直用的别人的,这两天参考一些资料自己写了个ListView下拉刷新的控件,自己会写才能掌握在自己手里,以后扩展什么的,