滚动到顶部自动加载数据的listview封装
2016-04-18 14:09
351 查看
AutoLoadMoreListView
autoloadmorelistview_header.xml
MyAdapter
MainActivity
package com.example.niehongtao.listviewdemo; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.AbsListView; import android.widget.ListView; /** * Created by niehongtao on 16/4/18. */ public class AutoLoadMoreListView extends ListView { // 这个布尔变量是必须使用的,因为不然会访问多次网络,这个可以控制,防止访问多次网络 private boolean mIsLoading = false; private OnLoadMoreListener mOnLoadMoreListener; private View mHeaderView; public AutoLoadMoreListView(Context context) { super(context); init(context); } public AutoLoadMoreListView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { mHeaderView = View.inflate(context, R.layout.autoloadmorelistview_header, null); super.addHeaderView(mHeaderView); hideHeadView(); super.setOnScrollListener(mScrollListener); } private void hideHeadView() { mIsLoading = false; mHeaderView.setVisibility(View.GONE); } private void showHeadView() { mIsLoading = true; mHeaderView.setVisibility(View.VISIBLE); } /** * 加载完数据,供外界调用 */ public void onLoadMoreComplete() { mIsLoading = false; hideHeadView(); } private OnScrollListener mScrollListener = new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // if (scrollState == SCROLL_STATE_FLING || scrollState == SCROLL_STATE_TOUCH_SCROLL || scrollState == SCROLL_STATE_IDLE) { // // 是否到了第一个条目 // if (view.getFirstVisiblePosition() == 0 && !mIsLoading && mOnLoadMoreListener != null) { // showHeadView(); // mOnLoadMoreListener.onLoadMore(); // } // } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem == 0 && !mIsLoading && mOnLoadMoreListener != null) { showHeadView(); mOnLoadMoreListener.onLoadMore(); } } }; /** * 加载更多数据的接口 */ interface OnLoadMoreListener { void onLoadMore(); } public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { mOnLoadMoreListener = onLoadMoreListener; } }
autoloadmorelistview_header.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loading" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
MyAdapter
class MyAdapter extends BaseAdapter { private List<String> contents; private Context mContext; public MyAdapter(List<String> contents, Context context) { this.contents = contents; mContext = context; } @Override public int getCount() { return contents.size(); } @Override public Object getItem(int position) { return contents.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.item, parent, false); holder = new ViewHolder(); holder.tvContent = (TextView) convertView.findViewById(R.id.tvContent); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.tvContent.setText(contents.get(position)); return convertView; } class ViewHolder{ TextView tvContent; } }
MainActivity
public class MainActivity extends Activity { private AutoLoadMoreListView listview; private MyAdapter adapter; private List<String> contents; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); listview = (AutoLoadMoreListView) findViewById(R.id.listview); adapter = new MyAdapter(contents, this); listview.setAdapter(adapter); listview.setOnLoadMoreListener(new AutoLoadMoreListView.OnLoadMoreListener() { @Override public void onLoadMore() { handler.postDelayed(new Runnable() { @Override public void run() { load(); adapter.notifyDataSetChanged(); listview.setAdapter(adapter); listview.setSelection(20); listview.onLoadMoreComplete(); } }, 1000); } }); } protected void load() { ArrayList<String> list = new ArrayList<>(); for(int i = 0; i < 20; i++) { //每次加载20条数据 list.add("加载数据:::" + i); } contents.addAll(0, list); } private void initData() { contents = new ArrayList<String>(); for(int i = 0; i < 20; i++){ contents.add("加载数据:::" + i); } } }
相关文章推荐
- 看opengl 写代码(4) 画一个圆
- Java NIO使用及原理分析(二)(转)
- ACM 括号配对问题 Java
- Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案
- 文件同步rsync
- 在知乎上看到的一个关于Linux运维工程师必知的几点,希望对有志于从事运维工作的你有帮助
- 单继承
- spring aop事务传播方式和隔离级别
- java中类加载机制
- java实现图片与base64字符串之间的转换
- DatabaseImageViewer 数据库二进制数据查看器
- 【数据库】4种视图的特点及应用场景
- 总结Web应用中常用的各种Cache
- 欧几里德与拓展欧几里德算法
- util文件的作用
- CSS hack
- json转换为datatable
- 昨天刚看了Handler和HandlerThread这个东西,不明白为什么要用这么复杂的东西,而且Handler直接post的话好像还不是子线程运行。那我再开发的时候直接用Thread行不行?两个有什么区别?
- Sqlserver日期操作
- Java NIO使用及原理分析 (一)(转)