下拉刷新SwipeRefreshLayout(加入上拉加载更多)
来源:互联网 发布:好用的旅游软件知乎 编辑:程序博客网 时间:2024/05/21 10:16
google官方的下拉刷新SwipeRefreshLayout还是比较好用的。使用起来也相当简单,但是唯一美中不足的就是没有上拉加载更多。下面就来记录下SwipeRefreshLayout和上拉加载更多。
添加依赖:
compile 'cn.finalteam.loadingviewfinal:swipe-refresh-layout:1.0.1'
忘记在那里看到的这个库了,只是记录用法。
在xml中布局
<?xml version="1.0" encoding="utf-8"?><cn.finalteam.loadingviewfinal.SwipeRefreshLayoutFinal android:id="@+id/refresh_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:refreshLoadingColor="@color/colorPrimary"><!--设置loading颜色--><RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F5F5F5" > <FrameLayout android:layout_width="match_parent" android:layout_height="1dp" android:background="#f6f6f6" /> <com.prosland.juehuo.view.MyListViewLoadMore android:id="@+id/share_listview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/title" android:divider="@null" android:scrollbars="none" android:listSelector="#00000000" android:layout_margin="12dp" ></com.prosland.juehuo.view.MyListViewLoadMore></RelativeLayout></cn.finalteam.loadingviewfinal.SwipeRefreshLayoutFinal>
创建MyListViewLoadMore类:
package com.prosland.juehuo.view;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.AbsListView;import android.widget.ListView;import com.prosland.juehuo.R;/** * 自定义listview 加上加载更多 的footview * Created by vip on 2016/7/5. */public class MyListViewLoadMore extends ListView implements AbsListView.OnScrollListener { View footView; int totalCount; int last; boolean isLoading = false; Context context; private OnScrollListener onScrollListener; public MyListViewLoadMore(Context context) { super(context); this.context = context; } public MyListViewLoadMore(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public MyListViewLoadMore(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public void initView() { LayoutInflater inflater = LayoutInflater.from(context); if (footView == null) { footView = inflater.inflate(R.layout.foot_layout, null); this.addFooterView(footView); } this.setOnScrollListener(this); } @Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { this.last = arg1 + arg2; this.totalCount = arg3; if (onScrollListener != null) { onScrollListener.onScroll(arg1); } } // 滑动监听 @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { if (iLoadListener != null) { if (totalCount == last && arg1 == SCROLL_STATE_IDLE) { if (!isLoading) { isLoading = true; if(footView!=null){ footView.findViewById(R.id.foot_layout).setVisibility(View.VISIBLE); } iLoadListener.onLoad(); } } } } public void remoView() { if (footView != null) { isLoading = true; this.removeFooterView(footView); } } public void addView() { if (footView != null) { isLoading = false; this.addFooterView(footView); } }public View getFootView(){ return footView;} ILoadListener iLoadListener; // 设置监听 public void setLoadListener(ILoadListener iLoadListener) { this.iLoadListener = iLoadListener; } public void gong(){ footView.setVisibility(View.GONE); } public void visibility(){ footView.setVisibility(View.VISIBLE); } // 定义回掉接口 public interface ILoadListener { public void onLoad(); } // 加载完成的。 public void onLoadMoreComplete() { isLoading = false; if (footView != null) footView.findViewById(R.id.foot_layout).setVisibility(View.GONE); this.setOnScrollListener(this); } boolean b_gun = false; // 设置 是否 滚动 public void setGun(boolean gun) { b_gun = true; } /** * 设置滚动接口 * * @param onScrollListener */ public void setOnScrollListener(OnScrollListener onScrollListener) { this.onScrollListener = onScrollListener; } /** * 滚动的回调接口 */ public interface OnScrollListener { /** * 回调方法, 返回MyScrollView滑动的Y方向距离 */ public void onScroll(int firstVisibleItem); }// public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// if (b_gun) {// int expandSpec = MeasureSpec.makeMeasureSpec(// Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);// super.onMeasure(widthMeasureSpec, expandSpec);// } else {// super.onMeasure(widthMeasureSpec, heightMeasureSpec);// }// }}
在Activity中使用:
package com.prosland.juehuo.safety;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.os.Message;import android.support.v4.widget.SwipeRefreshLayout;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ImageView;import android.widget.TextView;import com.bumptech.glide.Glide;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ContentView;import com.lidroid.xutils.view.annotation.ViewInject;import com.lzy.imagepicker.ImagePicker;import com.lzy.imagepicker.bean.ImageItem;import com.prosland.juehuo.AppApplication;import com.prosland.juehuo.BaseActivity;import com.prosland.juehuo.R;import com.prosland.juehuo.adapter.base.BaseViewHolderAdapter;import com.prosland.juehuo.bean.Entity;import com.prosland.juehuo.bean.message.EntityObject;import com.prosland.juehuo.bean.safe.Contents;import com.prosland.juehuo.bean.safe.ImageInfo;import com.prosland.juehuo.bean.safe.ShareItemBo;import com.prosland.juehuo.bean.safe.ShareSafeList;import com.prosland.juehuo.bean.safe.ShareSafeListInfo;import com.prosland.juehuo.utils.AndroidUtils;import com.prosland.juehuo.utils.Constants;import com.prosland.juehuo.utils.DateUtil;import com.prosland.juehuo.utils.Global;import com.prosland.juehuo.utils.LogUtils;import com.prosland.juehuo.utils.MyHttputils;import com.prosland.juehuo.utils.ToastUtils;import com.prosland.juehuo.view.MyListViewLoadMore;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import cn.finalteam.loadingviewfinal.SwipeRefreshLayoutFinal;/** * 分享安全经验 */@ContentView(R.layout.activity_share_safe)public class ShareSafeActivity extends BaseActivity implements View.OnClickListener, MyListViewLoadMore.ILoadListener, MyListViewLoadMore.OnScrollListener { @ViewInject(R.id.share_listview) private MyListViewLoadMore mListView; @ViewInject(R.id.textview_title) private TextView titleContent; @ViewInject(R.id.textview_back) private TextView mback; private ShareSafeAdapter adapter; private List<ShareSafeList> list = new ArrayList<>(); private ShareItemBo shareItemBo; private List<Contents> contentList = new ArrayList<>(); @ViewInject(R.id.refresh_layout) private SwipeRefreshLayoutFinal refresh_layout; private int mPage = 1; private String titleImageBg = ""; private ArrayList<ImageInfo> imageList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ViewUtils.inject(this); initView(); titleContent.setText("分享安全经验"); mListView.initView(); adapter = new ShareSafeAdapter(this, list, R.layout.share_safe_listview_item); mListView.setAdapter(adapter); setSwipeRefreshInfo(); } private void setSwipeRefreshInfo() { //下拉刷新 refresh_layout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { requestList(1); } }); mListView.setLoadListener(this); mListView.initView(); refresh_layout.autoRefresh(); } @Override protected void onResume() { super.onResume(); if (AppApplication.shareSafe) { setSwipeRefreshInfo(); } } //上拉加载 @Override public void onLoad() { requestList(mPage); } /** * 请求列表 */ private void requestList(final int page) { String url = "experience/getMyExp"; Map<String, String> map = new HashMap<>(); map.put("page", page + ""); map.put("page_size", "20"); isShowDialog = false; MyHttputils.getInstance(ShareSafeActivity.this).get2(ShareSafeActivity.this, url, map, new Entity<ShareSafeListInfo>() { @Override public void onSuccess(ShareSafeListInfo object) { LogUtils.d("分享列表============" + object.toString()); if (page == 1) { list.clear(); refresh_layout.onRefreshComplete(); } else { mListView.onLoadMoreComplete(); } mPage = page + 1; list.addAll(object.getList()); initData(list); if (object.getList().size() < 20) { mListView.setLoadListener(null); mListView.remoView();// ToastUtils.toast(ShareSafeActivity.this, "已没有更多数据"); } else { mListView.setLoadListener(ShareSafeActivity.this); if (mListView.getFooterViewsCount() == 0) { mListView.addView(); } } adapter.notifyDataSetChanged(); } @Override public void onFailure(Object object) { refresh_layout.onRefreshComplete(); } }); } private void initData(final List<ShareSafeList> list) { mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int status = -1; if (position != 0) { status = list.get(position - 1).getStatus(); } LogUtils.d("position-=================" + (position - 1)); ShareSafeList exp; if (position == 0) { exp = list.get(0); } else { exp = list.get(position - 1); } int experiemceShareId = exp.getExperienceShareId(); LogUtils.d("experiemceShareId===" + experiemceShareId); if (status == 0) { //请求 requestItem(experiemceShareId, position, exp.getBgImg(), exp.getShareName()); } else if (status == 1 || status == 2 || status == 3||status==4) {//1私密2审核中 3公开 4不通过 LogUtils.d("分享的title======"+exp.getShareName()); Intent intent = new Intent(ShareSafeActivity.this, ShareDetailsActivity.class); intent.putExtra(ShareDetailsActivity.ACTION_DISCUSS_TIMES, exp.getDiscussTimes()); intent.putExtra(ShareDetailsActivity.ACTION_THUMBS_TIMES, exp.getThumbsTimes()); intent.putExtra(ShareDetailsActivity.ACTION_EXPERIENCE_SHARE_ID, experiemceShareId); intent.putExtra(ShareDetailsActivity.ACTION_EXPERIENCE_SHARE_TITLE, exp.getShareName()); intent.putExtra("type", "sharesafe"); intent.putExtra(Global.share_status, status); startActivity(intent); } } }); } /** * 请求单个 * * @param */ private void requestItem(int id, final int position, final String bgImage, String shareName) { String url = "experience/getContent"; Map<String, String> map = new HashMap<>(); map.put("experienceShareId", id + ""); final ArrayList<ImageInfo> images = new ArrayList<ImageInfo>(); MyHttputils.getInstance(context).get4(context, url, map, new EntityObject() { @Override public void onSuccess(Object object) { shareItemBo = (ShareItemBo) object; String json = shareItemBo.getContent(); Gson gson = new Gson(); //将json格式转化成javabean Object results = gson.fromJson(json, new TypeToken<List<Contents>>() { }.getType()); contentList = (List<Contents>) results; LogUtils.d("点击单个返回==========" + object.toString()); dismissDialog(); for (int i = 0; i < contentList.size(); i++) { ImageInfo item = new ImageInfo(contentList.get(i).getImg(), contentList.get(i).getText()); images.add(item); } String shareName = list.get(position - 1).getShareName();//标题 int experiemceShareId = list.get(position - 1).getExperienceShareId(); Intent intent = new Intent(ShareSafeActivity.this, EditShareActivity.class); intent.putExtra("photo_list", images); intent.putExtra("status", "item"); intent.putExtra("shareName", shareName); intent.putExtra("titleImageBg", bgImage); intent.putExtra("shareName", shareName); intent.putExtra("experiemceShareId", experiemceShareId); startActivityForResult(intent, EDIT_IMAGE); } @Override public void onFailure(Object object) { dismissDialog(); } }); } private void initView() { //添加listView头部 View headerView = View.inflate(this, R.layout.share_safe_list_head, null); mListView.addHeaderView(headerView); ImageView add_image = (ImageView) headerView.findViewById(R.id.add_image); TextView find_activity_detail = (TextView) headerView.findViewById(R.id.find_activity_detail); add_image.setOnClickListener(this); find_activity_detail.setOnClickListener(this); mback.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.find_activity_detail://查看活动详情// ToastUtils.toast(this, "查看活动详情"); Intent intent = new Intent(this, ActivityDetailActivity.class); startActivity(intent); break; case R.id.add_image://选择照片 chooseImage(CHOOSE_PHOTO); break; case R.id.textview_back://返回 finish(); break; } } @Override public void onScroll(int firstVisibleItem) { } private class ShareSafeAdapter extends BaseViewHolderAdapter<ShareSafeList> { public ShareSafeAdapter(Context context, List<ShareSafeList> data, int layoutRes) { super(context, data, layoutRes); } @Override protected void bindData(int pos, ShareSafeList itemData) { TextView share_type = getViewFromHolder(R.id.share_type);//类型 草稿 TextView title = getViewFromHolder(R.id.text_basis_safety);//标题 用电常识 TextView time = getViewFromHolder(R.id.share_time); TextView zan_number = getViewFromHolder(R.id.zan_number);//点赞数 TextView comment_number = getViewFromHolder(R.id.comment_number);//评论数 TextView find_number = getViewFromHolder(R.id.find_number);//浏览数 TextView agree = getViewFromHolder(R.id.agree);//已采纳 TextView review = getViewFromHolder(R.id.review);//审核中 TextView no_agree = getViewFromHolder(R.id.no_agree);//未通过 TextView secret = getViewFromHolder(R.id.secret);//私密 ImageView rl_share_safe = getViewFromHolder(R.id.share_safe_img);//布局 //加载本地图片 Glide.with(ShareSafeActivity.this) .load(Constants.SERVER_IMAGE_ADDRESS + itemData.getBgImg() + "&width=" + AndroidUtils.getScreenSize(context, 1) / 2) .into(rl_share_safe); share_type.setVisibility(View.VISIBLE); agree.setVisibility(View.VISIBLE); review.setVisibility(View.VISIBLE); no_agree.setVisibility(View.VISIBLE); secret.setVisibility(View.VISIBLE); zan_number.setText(itemData.getThumbsTimes() + ""); comment_number.setText("" + itemData.getDiscussTimes()); find_number.setText("" + itemData.getReadTimes()); title.setText(itemData.getShareName() + ""); String timeStr = DateUtil.getDateString(itemData.getCreateTime()); time.setText("" + timeStr); if (itemData.getAccept() == 0) { agree.setVisibility(View.GONE); } else { agree.setVisibility(View.VISIBLE); } switch (itemData.getStatus()) {//状态:0草稿 1私密 2审核中 3公开 4不通过 case 0: share_type.setVisibility(View.VISIBLE); secret.setVisibility(View.GONE); review.setVisibility(View.GONE); no_agree.setVisibility(View.GONE); agree.setVisibility(View.GONE); break; case 1: share_type.setVisibility(View.GONE); secret.setVisibility(View.GONE); review.setVisibility(View.GONE); no_agree.setVisibility(View.GONE); agree.setVisibility(View.GONE); break; case 2: share_type.setVisibility(View.GONE); secret.setVisibility(View.GONE); review.setVisibility(View.VISIBLE); no_agree.setVisibility(View.GONE); agree.setVisibility(View.GONE); break; case 3: share_type.setVisibility(View.GONE); secret.setVisibility(View.GONE); review.setVisibility(View.GONE); no_agree.setVisibility(View.GONE); agree.setVisibility(View.GONE); break; case 4: share_type.setVisibility(View.GONE); secret.setVisibility(View.GONE); review.setVisibility(View.GONE); no_agree.setVisibility(View.VISIBLE); agree.setVisibility(View.GONE); break; } } } @Override protected void onActivityResult(int requestCode, int resultCode, final Intent data) { if (resultCode == ImagePicker.RESULT_CODE_ITEMS) {//选择多张照片 if (data != null && requestCode == IMAGE_PICKER) { ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS); List<String> listPath = new ArrayList<String>(); imageList.clear(); File file; for (int i = 0; i < images.size(); i++) {// images.get(i).path = BitmapHelper.compressBitmap(context, images.get(i).path, Global.CROP_WIDTH, Global.CROP_HEIGHT, true); //压缩图片 file = new File(images.get(i).path); Log.d("返回的图片大小", file.length() + "" + "选择的图片=======" + images.get(i).path); if (file.length() > 0) { images.get(i).path = compressPath(images.get(i).path).getAbsolutePath(); Log.d("返回的图片", images.get(i).path + "图片的大小" + new File(images.get(i).path).length()); } else { images.get(i).path = ""; } } //将file大小等于0的字节过滤出来 for (ImageItem item : images) { if (!"".equals(item.path)) { imageList.add(new ImageInfo(item.path, "")); } }// Message message = mHandleres.obtainMessage();// message.what = 0;// message.obj = images;// mHandleres.sendMessage(message); if (images.size() <= 0) { ToastUtils.toast(ShareSafeActivity.this, "图片读取失败"); return; } Intent intent = new Intent(ShareSafeActivity.this, EditShareActivity.class); intent.putExtra("photo_list", imageList); intent.putExtra("status", "list"); intent.putExtra("shareName", ""); intent.putExtra("experiemceShareId", -1);// if (loadDialog.isShowing() && loadDialog != null) {// dismissDialog();// } startActivityForResult(intent, EDIT_IMAGE); } } if (resultCode == RESULT_OK) { if (requestCode == EDIT_IMAGE) { requestList(1); } } } private android.os.Handler mHandleres = new android.os.Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0) { ArrayList<ImageItem> images = (ArrayList<ImageItem>) msg.obj; Intent intent = new Intent(ShareSafeActivity.this, EditShareActivity.class); intent.putExtra("photo_list", images); intent.putExtra("status", "list"); intent.putExtra("shareName", ""); intent.putExtra("experiemceShareId", -1); startActivityForResult(intent, EDIT_IMAGE); } } };}
这个是我项目中的一个类,需要自己根据自己的不同的情况更改。基本使用如下:
1.创建activity实现MyListViewLoadMore.ILoadListener, MyListViewLoadMore.OnScrollListener接口
2.重写onLoad(),onScroll()方法
3.通过setOnRefreshListener接口实现onRefresh()下拉刷新的方法
4.监听setLoadListener
5.autoRefresh实现自动刷新
基本流程就是这样的,具体使用可以参照我的类。自我感觉还比较好用。
1 0
- 下拉刷新SwipeRefreshLayout(加入上拉加载更多)
- 自定义下拉刷新上拉加载更多(SwipeRefreshLayout)风格
- SwipeRefreshLayout下拉刷新与上拉加载更多,分页加载
- SwipeRefreshLayout实现下拉刷新、上拉加载更多功能
- 使用SwipeRefreshLayout实现下拉刷新与上拉加载更多
- recyclerview+swiperefreshlayout实现GridView下拉刷新,上拉加载更多
- SwipeRefreshLayout配合RecyclerView实现上拉加载更多下拉刷新
- SwipeRefreshLayout + RecyclerView下拉刷新,上拉加载更多
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉加载更多
- SwipeRefreshLayout +RecycleView实现上拉加载更多和下拉刷新
- android:ListView下拉刷新上拉加载(SwipeRefreshLayout+滑动监听加载更多)
- RecyclerView+SwipeRefreshLayout+ViewPager实现上拉加载更多下拉刷新和添加Banner(附源码)
- SwipeRefreshLayout 上拉加载与下拉刷新
- SwipeRefreshLayout下拉刷新和上拉加载
- SwipeRefreshLayout上拉加载 下拉刷新
- swipeRefreshLayout 上拉加载 下拉刷新
- SwipeRefreshLayout下拉刷新上拉加载详解
- 自定义下拉刷新上拉加载控件(SwipeRefreshLayout + recyclerView)
- 深度卷积网络CNN与图像语义分割
- 《初入linux》--第五部分-用户管理
- Cron 表达式详解和案例
- PTA--03-树2 List Leaves
- xutils,了解注解和实现方式
- 下拉刷新SwipeRefreshLayout(加入上拉加载更多)
- 单例模式的示例代码
- Windows上的的神技能,你知道几个?
- RGB,16进制色彩图
- google java代码规范说明
- C#过滤器
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
- JS日期:根据出生日期 得到周岁年龄
- iOS_iTunesConnect协议更新导致无法构建新版本(协议、税务和银行业务)