ListView分页功能(2) 自定义View实现分页功能

来源:互联网 发布:淘宝月老祠堂怎么样 编辑:程序博客网 时间:2024/04/30 02:21

ListView分页功能(2) 自定义View实现分页功能

(1)自定义View 继承ListView实现OnScrollListener;

(2)设置一个回调接口,用于客户加载数据, 客户实现这个接口

(3)提供一个方法,通知数据加载完成

(3) 通过onScroll()和onScrollStateChanged()判断是否滑到底部,

进行加载新数据。




自定义ListView:

package com.example.listviewpagedemo;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.LinearLayout;import android.widget.ListView;public class MyListView extends ListView implements OnScrollListener{private LinearLayout footLayout;private boolean isLoading;//加载完成了private int bottomIndex = 0;public MyListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView(context);}public MyListView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyListView(Context context) {this(context, null);}/** * 初始化View * @param context */private void initView(Context context) {LayoutInflater inflater = LayoutInflater.from(context);footLayout = (LinearLayout) inflater.inflate(R.layout.footer, null);this.addFooterView(footLayout);//设置监听this.setOnScrollListener(this);footLayout.setVisibility(View.GONE);}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {try {//拉到了最底部,并停止了滚动, 加载新的数据if(isBottom && scrollState == SCROLL_STATE_IDLE){if(!isLoading){Log.i("tag", "onScrollStateChanged>>>isbottom");footLayout.setVisibility(View.VISIBLE);//加载新的数据mListener.onLoad();}}} catch (Exception e) {e.printStackTrace();}}boolean isBottom = false;@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {/** *拉到了最低端 */if(firstVisibleItem + visibleItemCount >= totalItemCount) {Log.i("tag", "onScroll=-====isBottom = true;");bottomIndex = firstVisibleItem + visibleItemCount ;isBottom = true;}else {isBottom = false;}}/** *数据加载完了  */public void doComplete() {footLayout.setVisibility(View.GONE);isLoading = false;this.setSelection(bottomIndex);}private onLoadListener mListener;public void setOnLoadListener(onLoadListener mListener) {this.mListener = mListener;}public interface onLoadListener {public void onLoad();}}



MainActivity.java

使用Thread+Handler 加载和更新数据数据

(1)实现自定义Listview中定义的OnLoadListener接口,用于回调加载数据。

(2)创建一个子线程用来加载数据,通过handler发送一个空消息,通知数据

加载完成, handler中使用Adapter.notifyDataChanged() 通知数据更新(footerVie消失)

注意:MyListView 调用doComplete() 通知listview数据加载完了的位置,我第一次是在子线程中调用lv.doComplete() 通知, 但是一直自动闪退,未找到错误,

最后发现使用 是listview设置adapter是在Handler中, 而开始子线程启动时,listview的适配器还未设置,

所以将lv.doComplete() 通知listview数据加载完成放在了Handler中。

package com.example.listviewpagedemo;import java.util.ArrayList;import java.util.List;import com.example.listviewpagedemo.MyListView.onLoadListener;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Window;import android.widget.ArrayAdapter;import android.widget.LinearLayout;public class MainActivity extends Activity implements onLoadListener {/* * 底部刷新加载布局 */LinearLayout footLayout ;MyListView lv;ArrayAdapter<String> adapter;List<String>  datas = new ArrayList<String>();;boolean isLoadOver = false;/** * 加载完了完数据通知根性 */Handler handler = new  Handler() {public void handleMessage(Message msg) {if(msg.what == 1){if(adapter == null){adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,datas);lv.setAdapter(adapter);}else {adapter.notifyDataSetChanged();}}lv.doComplete();}; };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initView();initDatas();}/** * 初始化数据 */private void initDatas() {new Thread(new Runnable(){@Overridepublic void run() {try {Thread.sleep(2000);//加载数据for (int i = 0; i < 20; i++) {datas.add("项目展示" + datas.size());}lv.doComplete();handler.sendEmptyMessage(1);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}/** * 初始化view */private void initView() {lv = (MyListView)findViewById(R.id.listView1);lv.setOnLoadListener(this);}@Overridepublic void onLoad() {try {//加载数据initDatas();/*//加载数据for (int i = 0; i < 20; i++) {datas.add("项目展示" + datas.size());}lv.doComplete();handler.sendEmptyMessage(1);*/} catch (Exception e) {e.printStackTrace();}}}

0 0
原创粉丝点击