android ListView 分页加载数据

1.mainActivity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:orientation="vertical"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context="mydemo.mycom.demo2.Home">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btn_home_to_login"
            android:text="@string/btn_to_register"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/btn_exit"
            android:text="@string/btn_to_exit"/>
        </LinearLayout>

   <ListView
       android:id="@+id/lv"
       android:layout_width="fill_parent"
       android:layout_height="match_parent"></ListView>

</LinearLayout>

2.ListView的itemActivity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:orientation="horizontal"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context="mydemo.mycom.demo2.Home">

        <TextView
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:textColor="#FF172366"
            android:padding="5dp"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/tv_username"
            android:layout_width="wrap_content"
            android:padding="5dp"
            android:textColor="#FF870918"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tv_password"
            android:layout_width="wrap_content"
            android:padding="5dp"
            android:layout_height="wrap_content" />


</LinearLayout>

3.ListView footerActivity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="mydemo.mycom.demo2.Footer">

    <ProgressBar
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyle"
        />
    <TextView android:text="@string/load_text"
        android:textSize="20sp"
        android:gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

4.MainActivity.java

package mydemo.mycom.demo2;

import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;


import mydemo.mycom.demo2.dao.UserDao;
import mydemo.mycom.demo2.entity.UserInfo;
import mydemo.mycom.demo2.service.LoginService;


public class Home extends ActionBarActivity implements View.OnClickListener {

    private ListView lv;
    private Button btn_home_to_login;
    private Button btn_exit;
    private List<UserInfo> list;
    // 设置一个最大的数据条数,超过即不再加载
    private int pageSize=10; //每次获取多少条数据
    // 最后可见条目的索引
    private int pages;//总共有多少页
    private boolean loadfinished = true;
    private MyAdapter myAdapter;
    private View footer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        btn_home_to_login = (Button)findViewById(R.id.btn_home_to_login);
        btn_exit = (Button)findViewById(R.id.btn_exit);
        lv = (ListView)findViewById(R.id.lv);
        btn_home_to_login.setOnClickListener(this);
        btn_exit.setOnClickListener(this);

        footer = getLayoutInflater().inflate(R.layout.activity_footer,null);

        UserDao dao = new UserDao(this);
        list = dao.getUserInfo(1,10);

        int total = dao.getTotal();

        System.out.println(total+"===================================");

        pages = total%pageSize==0 ? total/pageSize : total/pageSize+1;

        lv.setOnScrollListener(new MyOnScrollListener());

        myAdapter = new MyAdapter();
        //添加页脚(放在ListView最后)
        lv.addFooterView(footer);
        lv.setAdapter(myAdapter);
        lv.removeFooterView(footer);

        lv.setOnItemClickListener(new MyItemClickListener());

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId())
        {
            case R.id.btn_home_to_login:
                Intent intent = new Intent();
                intent.setClass(Home.this,Register.class);
                startActivity(intent);
                break;
            case R.id.btn_exit:
                //清除登录数据
                LoginService.removeLoginInfo(this);
                Toast.makeText(this,"退出成功",Toast.LENGTH_SHORT).show();

                Intent toLogin = new Intent();
                toLogin.setClass(Home.this,MainActivity.class);
                startActivity(toLogin);
                break;
        }
    }


    public class MyAdapter extends BaseAdapter
    {
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            UserInfo user = list.get(i);

            View itemview = View.inflate(Home.this,R.layout.activity_item,null);

            TextView tv_id = (TextView)itemview.findViewById(R.id.tv_id);
            TextView tv_username = (TextView)itemview.findViewById(R.id.tv_username);
            TextView tv_password = (TextView)itemview.findViewById(R.id.tv_password);

            tv_id.setText(user.getId()+"");
            tv_username.setText(user.getUsername());
            tv_password.setText(user.getPassword());
            return itemview;
        }
    }


    public class MyItemClickListener implements AdapterView.OnItemClickListener
    {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            ListView lView = (ListView)lv;
            TextView tv_id = (TextView)view.findViewById(R.id.tv_id);
            TextView tv_username = (TextView)view.findViewById(R.id.tv_username);
            TextView tv_password = (TextView)view.findViewById(R.id.tv_password);
            String id = tv_id.getText().toString();
            String username = tv_username.getText().toString();
            String password = tv_password.getText().toString();
            Toast.makeText(getApplicationContext(), id+","+username, Toast.LENGTH_SHORT).show();
            //不同的activity之间的传值
            Intent intent = new Intent();
            intent.putExtra("username",username);
            intent.putExtra("password",password);
            intent.putExtra("id",id);
            intent.setClass(Home.this,Edit.class);
            startActivity(intent);
        }
    }

    public class MyOnScrollListener implements AbsListView.OnScrollListener
    {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            int lastItemIndex = lv.getLastVisiblePosition(); //获取当前屏幕最后的Item的id
            System.out.println("====lastItemIndex:"+lastItemIndex);
            System.out.println("====totalItemCount:"+totalItemCount);
            if(lastItemIndex>0&&(lastItemIndex+1)==totalItemCount) //达到数据的最后一条记录
            {
                //当前页
                int currentpage = totalItemCount%pageSize==0 ? totalItemCount /pageSize :totalItemCount /pageSize+1;
                final int nextpage = currentpage +1; //下一页
                System.out.println("================currentpage:"+currentpage);
                System.out.println("================nextpage:"+nextpage);
                if(nextpage<=pages && loadfinished)
                {
                    loadfinished = false;
                    lv.addFooterView(footer);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try{
                                Thread.sleep(3000);
                            }
                             catch (Exception e)
                             {

                             }
                            UserDao dao = new UserDao(Home.this);

                            List<UserInfo> result = dao.getUserInfo(nextpage,pageSize);
                            handler.sendMessage(handler.obtainMessage(100,result));
                        }
                    }).start();
                }
            }
        }


        Handler handler = new Handler() {

            public void handleMessage(Message msg)
            {
                list.addAll((List<UserInfo>)msg.obj);
                //告诉ListView数据已经发生改变,要求ListView更新界面显示
                myAdapter.notifyDataSetChanged();
                if(lv.getFooterViewsCount()>0)
                {
                    lv.removeFooterView(footer);
                }
                loadfinished = true;
;            }

        };
    }



}

5.DAO.java

public List<UserInfo> getUserInfo(int pageIndex,int pageSize)
    {
        SQLiteDatabase db = helper.getWritableDatabase();
        List<UserInfo> list = new ArrayList<UserInfo>();

        String sql = "select * from user order by id asc limit "+(pageIndex-1)*pageSize+","+pageSize;
        System.out.println("sql=======:"+sql+",pageIndex:"+pageIndex);

        Cursor cursor = db.rawQuery("select * from user order by id asc limit ?,?",new String[]{((pageIndex-1)*pageSize)+"",pageSize+""});
        while(cursor.moveToNext())
        {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String username = cursor.getString(cursor.getColumnIndex("username"));
            String password = cursor.getString(cursor.getColumnIndex("password"));

            UserInfo userInfo = new UserInfo(id,username,password);
            list.add(userInfo);
        }
        cursor.close();
        db.close();
        return list;

    }

5.Entity.java

package mydemo.mycom.demo2.entity;


public class UserInfo {
    private int id;
    private String username;
    private String password;

    public UserInfo()
    { }

    public UserInfo(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
原文地址:https://www.cnblogs.com/zoro-zero/p/4516298.html