分享

(Android)五分钟让你轻松学会下拉刷新和上拉加载更多

 爱开发 2022-08-02 发布于广东


为了更好的学习和工作,动动小手收藏起来吧!

分享一个谷歌自带的下拉刷新和上拉加载更多例子:

效果图:





自定义RefreshLayout继承 SwipeRefreshLayout

/**

* 继承自SwipeRefreshLayout,从而实现滑动到底部时上拉加载更多的功能.

*/

public class RefreshLayout extends SwipeRefreshLayout implements

OnScrollListener {

/**

* 滑动到最下面时的上拉操作

*/

private int mTouchSlop;

/**

* listview实例

*/

private ListView mListView;

/**

* 上拉监听器, 到了最底部的上拉加载操作

*/

private OnLoadListener mOnLoadListener;

/**

* ListView的加载中footer

*/

private View mListViewFooter;

/**

* 按下时的y坐标

*/

private int mYDown;

/**

* 抬起时的y坐标, 与mYDown一起用于滑动到底部时判断是上拉还是下拉

*/

private int mLastY;

/**

* 是否在加载中 ( 上拉加载更多 )

*/

private boolean isLoading = false;

/**

* @param context

*/

public RefreshLayout(Context context) {

this(context, null);

}

@SuppressLint("InflateParams")

public RefreshLayout(Context context, AttributeSet attrs) {

super(context, attrs);

mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

mListViewFooter = LayoutInflater.from(context).inflate(

R.layout.listview_footer, null, false);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

// 初始化ListView对象

if (mListView == null) {

getListView();

}

}

/**

* 获取ListView对象

*/

private void getListView() {

int childs = getChildCount();

if (childs > 0) {

View childView = getChildAt(0);

if (childView instanceof ListView) {

mListView = (ListView) childView;

// 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载

mListView.setOnScrollListener(this);

Log.d(VIEW_LOG_TAG, "### 找到listview");

}

}

}

/*

* (non-Javadoc)

*

* @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent)

*/

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

final int action = event.getAction();

switch (action) {

case MotionEvent.ACTION_DOWN:

// 按下

mYDown = (int) event.getRawY();

break;

case MotionEvent.ACTION_MOVE:

// 移动

mLastY = (int) event.getRawY();

break;

case MotionEvent.ACTION_UP:

// 抬起

if (canLoad()) {

loadData();

}

break;

default:

break;

}

return super.dispatchTouchEvent(event);

}

/**

* 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作.

*

* @return

*/

private boolean canLoad() {

return isBottom() && !isLoading && isPullUp();

}

/**

* 判断是否到了最底部

*/

private boolean isBottom() {

if (mListView != null && mListView.getAdapter() != null) {

return mListView.getLastVisiblePosition() == (mListView

.getAdapter().getCount() - 1);

}

return false;

}

/**

* 是否是上拉操作

*

* @return

*/

private boolean isPullUp() {

return (mYDown - mLastY) >= mTouchSlop;

}

/**

* 如果到了最底部,而且是上拉操作.那么执行onLoad方法

*/

private void loadData() {

if (mOnLoadListener != null) {

// 设置状态

setLoading(true);

//

mOnLoadListener.onLoad();

}

}

/**

* @param loading

*/

public void setLoading(boolean loading) {

isLoading = loading;

if (isLoading) {

mListView.addFooterView(mListViewFooter);

} else {

mListView.removeFooterView(mListViewFooter);

mYDown = 0;

mLastY = 0;

}

}

/**

* @param loadListener

*/

public void setOnLoadListener(OnLoadListener loadListener) {

mOnLoadListener = loadListener;

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// 滚动时到了最底部也可以加载更多

if (canLoad()) {

loadData();

}

}

/**

* 设置刷新

*/

public static void setRefreshing(SwipeRefreshLayout refreshLayout,

boolean refreshing, boolean notify) {

Class<? extends SwipeRefreshLayout> refreshLayoutClass = refreshLayout

.getClass();

if (refreshLayoutClass != null) {

try {

Method setRefreshing = refreshLayoutClass.getDeclaredMethod(

"setRefreshing", boolean.class, boolean.class);

setRefreshing.setAccessible(true);

setRefreshing.invoke(refreshLayout, refreshing, notify);

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

/**

* 加载更多的监听器

*/

public static interface OnLoadListener {

public void onLoad();

}

}

新建一个Activitiy

public class MainActivity extends Activity implements OnRefreshListener,

OnLoadListener {

private RefreshLayout swipeLayout;

private ListView listView;

private MyAdapter adapter;

private ArrayList<HashMap<String, String>> list;

private View header;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

setData();

setListener();

/*设置自动刷新 swipeLayout.setRefreshing(true);

在 setRefreshing(true)并没有触发onRefresh的,须要手动调用一次

*/

// swipeLayout.post(new Thread(new Runnable() {

// @Override

// public void run() {

// swipeLayout.setRefreshing(true);

// }

// }));

// onRefresh();

}

/**

* 初始化布局

*/

@SuppressLint({ "InlinedApi", "InflateParams" })

private void initView() {

header = getLayoutInflater().inflate(R.layout.header, null);

swipeLayout = (RefreshLayout) findViewById(R.id.swipe_container);

swipeLayout.setColorSchemeResources(R.color.color_bule2,R.color.color_bule,R.color.color_bule2,R.color.color_bule3);

}

/**

* 添加数据

*/

private void setData() {

list = new ArrayList<HashMap<String, String>>();

for (int i = 0; i < 10; i++) {

HashMap<String, String> map = new HashMap<String, String>();

map.put("itemImage", i+"默认");

map.put("itemText", i+"默认");

list.add(map);

}

listView = (ListView) findViewById(R.id.list);

listView.addHeaderView(header);

adapter = new MyAdapter(this, list);

listView.setAdapter(adapter);

}

/**

* 设置监听

*/

private void setListener() {

swipeLayout.setOnRefreshListener(this);

swipeLayout.setOnLoadListener(this);

}

/**

* 上拉刷新

*/

@Override

public void onRefresh() {

swipeLayout.postDelayed(new Runnable() {

@Override

public void run() {

// 更新数据 更新完后调用该方法结束刷新

list.clear();

for (int i = 0; i < 8; i++) {

HashMap<String, String> map = new HashMap<String, String>();

map.put("itemImage", i+"刷新");

map.put("itemText", i+"刷新");

list.add(map);

}

adapter.notifyDataSetChanged();

swipeLayout.setRefreshing(false);

}

}, 2000);

}

/**

* 加载更多

*/

@Override

public void onLoad() {

swipeLayout.postDelayed(new Runnable() {

@Override

public void run() {

// 更新数据 更新完后调用该方法结束刷新

swipeLayout.setLoading(false);

for (int i = 1; i < 10; i++) {

HashMap<String, String> map = new HashMap<String, String>();

map.put("itemImage", i+"更多");

map.put("itemText", i+"更多");

list.add(map);

}

adapter.notifyDataSetChanged();

}

}, 2000);

}

简单自定义一个Adapter适配器继承于BaseAdapter

public class MyAdapter extends BaseAdapter {

public ArrayList<HashMap<String, String>> list;

public Context context;

public LayoutInflater layoutInflater;

public MyAdapter(Context context, ArrayList<HashMap<String, String>> list) {

this.context = context;

this.list = list;

layoutInflater = LayoutInflater.from(context);

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return null;

}

@Override

public long getItemId(int position) {

return 0;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view = null;

ViewHolder holder = null;

if (convertView == null) {

view = layoutInflater.inflate(R.layout.item, null);

holder = new ViewHolder();

holder.txt =(TextView) view.findViewById(R.id.textView1);

view.setTag(holder);

} else {

view = convertView;

holder = (ViewHolder) view.getTag();

}

holder.txt.setText(list.get(position).get("itemText"));

return view;

}

static class ViewHolder {

TextView txt;

}

}

源码下载地址,请回复 刷新 即可

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多