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实现自动刷新
基本流程就是这样的,具体使用可以参照我的类。自我感觉还比较好用。