`
zhuxinzx
  • 浏览: 293731 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android ListView动态更新数据

阅读更多

Android ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中。

先看看效果:



需要注意的是程序在什么时候去更新数据,listVIew的setOnScrollListener监听是否滚到了最后一条记录。
取到的数据加到list中,最后记得调用adapter的notifyDataSetChanged,通知listview改变。

主文件:

import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.Toast;
 
public class ListViewActivity extends Activity {
    private ListView listView;
     
    // 定义适配器
    private ListItemAdapter listadpter;
     
    // 定义每一页显示行数
    private int VIEW_COUNT = 20;
     
    // 定义的页数
    private int index = 0;
     
    // 当前页
    private int currentPage = 1;
     
    // 所以数据的条数
    private int totalCount;
     
    // 每次取的数据,只要最后一次可能不一样。
    private int maxResult;
     
    // 泛型集合ArrayList
    private ArrayList<students> arrayList = new ArrayList<students>();
     
    // 数据操作的dao类
    StudentsDAO dao = new StudentsDAO(ListViewActivity.this);
     
    // 实体bean
    Students students = new Students();
     
    // 标记:上次的ID
    private boolean isUpdating = false;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        // 初始化界面
        initView();
         
        // 插入100条记录。
        dao.insert();
        totalCount = dao.getCount();
        maxResult = getMaxResult();
         
        // 调用dao里面的selectAll()方法
        arrayList = dao.getAllItems(index, maxResult);
         
        // 实例化适配器
        System.out.println("arrlist-->" + arrayList.size());
        listadpter = new ListItemAdapter(ListViewActivity.this, arrayList);
         
        // 填充适配器
        listView.setAdapter(listadpter);
 
        listView.setOnScrollListener(new OnScrollListener() {
 
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
 
            }
 
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem + visibleItemCount == totalItemCount
                        && !isUpdating) {
                    if (totalItemCount < totalCount) { // 防止最后一次取数据进入死循环。
                        Toast.makeText(ListViewActivity.this,
                                "正在取第" + (++currentPage) + "的数据",
                                Toast.LENGTH_LONG).show();
                        AsyncUpdateDatasTask asyncUpdateWeiBoDatasTask = new AsyncUpdateDatasTask();
                        asyncUpdateWeiBoDatasTask.execute();
                    }
                    System.out.println("begin update-------------");
                }
            }
        });
    }
 
    // 初始化界面方法
    private void initView() {
        // TODO Auto-generated method stub
        listView = (ListView) findViewById(R.id.list);
    }
 
    class AsyncUpdateDatasTask extends AsyncTask<void, void,="" list<students="">> {
 
        @Override
        protected List<students> doInBackground(Void... params) {
            // TODO Auto-generated method stub
            isUpdating = true;
            index += VIEW_COUNT;
            List<students> list = new ArrayList<students>();
            list = dao.getAllItems(index, maxResult);
            return list;
        }
 
        @Override
        protected void onPostExecute(List<students> result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            arrayList.addAll(result);
            listadpter.notifyDataSetChanged();
            isUpdating = false;
            System.out.println("end update--------------");
        }
    }
 
    private int getMaxResult() {
        int totalPage = (totalCount + VIEW_COUNT - 1) / VIEW_COUNT;
        return totalCount - (totalPage - 1) * VIEW_COUNT;
    }
}
</students></students></students></students></void,></students></students>




数据库Dao文件:

package com.shao.list;
 
import java.util.ArrayList;
import java.util.Random;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
public class StudentsDAO extends SQLiteOpenHelper {
 
    private final static String AUDIODATABASE_NAME = "student.db";
    private final static String TABLE = "student";
    private final static String COLUM_ID = "id";
    private final static String COLUM_NAME = "name";
    private final static String COLUM_AGE = "age";
    private final static int DATABASE_VERSION = 1;
    private long row;
    private ArrayList<students> arrayList;
 
    public StudentsDAO(Context context) {
        super(context, AUDIODATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        String sql = "CREATE TABLE " + TABLE + " (" + COLUM_ID
                + " INTEGER primary key autoincrement, " + " " + COLUM_NAME
                + " text, " + " " + COLUM_AGE + " int)";
        db.execSQL(sql);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        String sql = "DROP TABLE IF EXISTS " + TABLE;
        db.execSQL(sql);
    }
 
    public long insert() {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        Random random = new Random();
        for (int i = 1; i <= 100; i++) {
            cv.put(COLUM_ID, i);
            cv.put(COLUM_NAME, "name" + String.valueOf(i));
            cv.put(COLUM_AGE, random.nextInt(100));
            row = db.insert(TABLE, null, cv);
        }
        db.close();
        return row;
    }
 
    // 查询记录的总数
    public int getCount() {
        SQLiteDatabase db = getWritableDatabase();
        String sql = "select count(*) from '" + TABLE + "'";
        Cursor c = db.rawQuery(sql, null);
        c.moveToFirst();
        int length = c.getInt(0);
        c.close();
        db.close();
        // System.out.println("length-->"+length);
        return length;
    }
 
    public ArrayList<students> getAllItems(int firstResult, int maxResult) {
        arrayList = new ArrayList<students>();
        SQLiteDatabase db = getWritableDatabase();
        String sql = "select * from '" + TABLE + "' limit ?,?";
        Cursor cursor = db.rawQuery(
                sql,
                new String[] { String.valueOf(firstResult),
                        String.valueOf(maxResult) });
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToFirst();
        }
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            Students students = new Students();
            students.setId(cursor.getInt(0));
            students.setName(cursor.getString(1));
            students.setAge(cursor.getInt(2));
            arrayList.add(students);
        }
        cursor.close();
        db.close();
        return arrayList;
    }
 
    public ArrayList<students> selectAll() {
        arrayList = new ArrayList<students>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.query(TABLE, null, null, null, null, null, null);
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToFirst();
        }
        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
            Students students = new Students();
            students.setId(cursor.getInt(0));
            students.setName(cursor.getString(1));
            students.setAge(cursor.getInt(2));
            arrayList.add(students);
        }
        cursor.close();
        db.close();
        return arrayList;
 
    }
 
}
</students></students></students></students></students>

 

分享到:
评论

相关推荐

    android ListView 动态追加数据

    通过以上步骤,我们可以实现Android ListView的动态追加数据及显示追加进度的功能。在实际项目中,还可以根据需求进行定制,例如添加动画效果,使用户体验更加流畅。记住,始终关注性能优化,以确保应用的流畅性和...

    android listview 下拉刷新 动态加载数据 图文混排

    以上就是关于“Android ListView下拉刷新、动态加载数据及图文混排”的实现步骤。通过这个功能,用户可以在滚动到列表底部时加载更多内容,而下拉刷新则允许用户获取最新的数据,提高了用户体验。

    Android ListView动态查询更新代码

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。动态查询和更新ListView是...通过SearchListView这个例子,我们可以学习如何在ListView中实现高效的搜索和动态更新功能,提升应用的用户体验。

    ListView中动态添加数据

    总结,动态添加数据到Android的ListView涉及以下几个关键步骤:创建数据模型,实现自定义Adapter,设置ListView和Adapter,向数据源添加新数据并通知Adapter,以及考虑性能优化措施。通过熟练掌握这些技巧,开发者...

    Android 根据EditText搜索框 ListView动态显示数据

    然后清空adapter,添加过滤后的数据,并调用`notifyDataSetChanged`通知ListView数据已改变,从而实现动态更新。 这就是如何在Android中根据EditText搜索框动态显示ListView数据的基本步骤。使用SimpleAdapter可以...

    android listview 动态适应高度问题

    在Android开发中,ListView是经常用来展示大量数据的视图组件。然而,当ListView的数据项数量不确定,或者每个数据项的高度不固定时,如何让ListView动态适应屏幕高度,避免出现滚动条异常或内容显示不全的问题,就...

    android ListView 动态添加删除

    当用户点击“添加”按钮时,创建一个新的MyItem实例,将其添加到数据列表中(可能是ArrayList或其他集合类型),然后调用Adapter的`notifyDataSetChanged()`方法,通知ListView数据集已更新。 4. **删除Item**: ...

    ListView动态加载数据分页

    在Android开发中,ListView是一种常见的UI组件,用于展示大量数据列表。当数据量过大时,一次性加载所有数据可能会导致性能问题,比如内存消耗过大、应用响应慢等。为了解决这些问题,通常会采用“动态加载数据分页...

    listview实现动态加载

    在Android开发中,ListView是一...综上,"ListView实现动态加载"涵盖了Android开发中的数据适配、视图复用、异步加载、滚动监听、内存优化等多个重要知识点。熟练掌握这些技巧,对于构建流畅、高效的列表界面至关重要。

    Android listview 下拉刷新

    下拉刷新功能允许用户通过在ListView顶部向下拉动来更新数据,这在实时性要求较高的应用中非常常见,例如社交媒体应用、新闻应用等。本节将深入探讨如何在Android中实现ListView的下拉刷新功能。 一、...

    Android listview动态加载不同布局

    "Android listview动态加载不同布局"这一主题,主要涉及如何在ListView中根据不同的数据类型或者状态显示不同的视图(View)布局,提升用户体验并优化性能。 首先,要实现ListView动态加载不同布局,我们需要理解...

    android动态加载Listview

    本项目“android动态加载Listview”旨在提供一种更实用、更贴近实际应用场景的数据动态加载解决方案。 首先,我们要理解什么是动态加载。动态加载(也称为懒加载)是在用户滚动ListView时按需加载数据的技术。它...

    Android_ListView动态刷新

    然而,在数据集更新时,如何实现实时或动态地刷新`ListView`,是开发者经常面临的问题。本文将围绕“Android_ListView动态刷新”这一主题,深入探讨实现`ListView`动态刷新的方法。 #### 一、透明界面的实现 在...

    Android用listview显示数据库中的数据

    在Android开发中,将数据库中的数据展示在ListView上是一项常见的任务。这通常涉及到与后端服务器的交互,数据的获取,以及数据适配器的使用。以下是对这一过程的详细阐述: 首先,我们需要建立Android应用与后台...

    ListView列表更新数据

    总的来说,`notifyDataSetChanged()`是Android开发中更新ListView数据的关键方法,通过合理使用它可以实现高效的列表数据刷新。对于新手来说,理解这个方法及其应用场景是提升开发技能的重要步骤。

    Android应用源码动态ListView,支持异步更新列表,异步更新图片.zip

    本示例中的“Android应用源码动态ListView,支持异步更新列表,异步更新图片.zip”提供了一个实现动态加载和异步更新功能的ListView的实例。下面将详细讲解这个主题中的关键知识点。 1. **动态ListView**: - 动态...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    对于父ListView的Adapter,你需要提供一个包含子ListView数据的列表。当调用getView()方法时,根据数据创建或复用一个View,并在这个View中添加子ListView。 子ListView的Adapter则需要处理其自身的数据源,这可能...

    Android中ListView动态刷新

    总结,`notifyDataSetChanged()`是Android中更新ListView数据的关键方法,它使得开发者能够在程序运行时轻松地实现列表数据的动态刷新,提供了丰富的用户体验。但同时也需要注意性能优化,合理使用,以避免对应用...

    ListView动态添加、移除item

    这样Adapter会自动重新加载数据并更新ListView。 三、动态移除item 1. 移除特定item时,首先从数据源中移除对应的对象,例如`myItemList.remove(index)`。 2. 同样,调用`notifyDataSetChanged()`让ListView知道...

    Android ListView 下拉刷新、上拉加载

    在Android开发中,ListView是常用的一种控件,用于展示大量数据列表。`下拉刷新`和`上拉加载`功能的实现,极大地提升了用户体验,让用户能够实时获取到最新的数据。本篇文章将深入探讨如何在ListView中实现这两种...

Global site tag (gtag.js) - Google Analytics