文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

android实现listview分页的方法

2022-06-06 10:00

关注

本文实例讲述了android实现listview分页的方法。分享给大家供大家参考。具体分析如下:

最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset关键字,前者是查询每页展示的记录数,后者是越过多少记录数,说得明白点就是忽略前面多少行记录之后,取多少行记录

我分页采用了一个重要的类Page,通过封装Page类,做为参数传递进来,返回出去也是个Page对象


import java.util.Collections; 
import java.util.List; 
 
public class Page<T> { 
  //-- 公共变量 --// 
  public static final String ASC = "asc"; 
  public static final String DESC = "desc"; 
  //-- 分页参数 --// 
  protected int pageNo = 0;// 当前页号<跟取数据的方式有关系> 
  protected int pageSize = 1;// 每页显示的记录数 
  protected String orderBy = null; 
  protected String order = null; 
  protected boolean autoCount = true; 
  //-- 返回结果 --// 
  protected List<T> result = Collections.emptyList(); 
  protected long totalCount = -1;// 总记录数 
  //-- 构造函数 --// 
  public Page() { 
  } 
  public Page(final int pageSize) { 
    setPageSize(pageSize); 
  } 
  public Page(final int pageSize, final boolean autoCount) { 
    setPageSize(pageSize); 
    setAutoCount(autoCount); 
  } 
  //-- 访问查询参数函数 --// 
   
  public int getPageNo() { 
    return pageNo; 
  } 
   
  public void setPageNo(final int pageNo) { 
    this.pageNo = pageNo; 
    if (pageNo < 0) { 
      this.pageNo = 0; 
    } 
  } 
   
  public int getPageSize() { 
    return pageSize; 
  } 
   
  public void setPageSize(final int pageSize) { 
    this.pageSize = pageSize; 
    if (pageSize < 0) { 
      this.pageSize = 0; 
    } 
  } 
   
  public int getFirst() { 
    return (pageNo * pageSize) + 1; 
  } 
   
  public String getOrderBy() { 
    return orderBy; 
  } 
   
  public void setOrderBy(final String orderBy) { 
    this.orderBy = orderBy; 
  } 
   
  public String getOrder() { 
    return order; 
  } 
   
  public void setOrder(String order) { 
    this.order = order; 
  } 
   
  public boolean isAutoCount() { 
    return autoCount; 
  } 
   
  public void setAutoCount(final boolean autoCount) { 
    this.autoCount = autoCount; 
  } 
  //-- 访问查询结果函数 --// 
   
  public List<T> getResult() { 
    return result; 
  } 
   
  public void setResult(final List<T> result) { 
    this.result = result; 
  } 
   
  public long getTotalCount() { 
    return totalCount; 
  } 
   
  public void setTotalCount(final long totalCount) { 
    this.totalCount = totalCount; 
  } 
   
  public long getTotalPages() { 
    if (totalCount < 0) 
      return -1; 
    long count = totalCount / pageSize; 
    if (totalCount % pageSize > 0) { 
      count++; 
    } 
    return count; 
  } 
   
  public boolean isHasNext() { 
    return (pageNo + 1 < getTotalPages()); 
  } 
   
  public int getNextPage() { 
    if (isHasNext()) 
      return pageNo + 1; 
    else 
      return pageNo; 
  } 
   
  public boolean isHasPre() { 
    return (pageNo - 1 >= 0); 
  } 
   
  public int getPrePage() { 
    if (isHasPre()) 
      return pageNo - 1; 
    else 
      return pageNo; 
  } 
}

下面是封装的POJO对象,界面listview的item展示就是靠它


public class Record { 
  private Integer rId; 
  private String fromUser; 
  private String toUser; 
  private String content; 
  private String rTime; 
  private Integer isReaded; 
  public Integer getrId() { 
    return rId; 
  } 
  public void setrId(Integer rId) { 
    this.rId = rId; 
  } 
  public String getFromUser() { 
    return fromUser; 
  } 
  public void setFromUser(String fromUser) { 
    this.fromUser = fromUser; 
  } 
  public String getToUser() { 
    return toUser; 
  } 
  public void setToUser(String toUser) { 
    this.toUser = toUser; 
  } 
  public String getContent() { 
    return content; 
  } 
  public void setContent(String content) { 
    this.content = content; 
  } 
  public String getrTime() { 
    return rTime; 
  } 
  public void setrTime(String rTime) { 
    this.rTime = rTime; 
  } 
  public Integer getIsReaded() { 
    return isReaded; 
  } 
  public void setIsReaded(Integer isReaded) { 
    this.isReaded = isReaded; 
  }
}

好吧,来看下DAO类里的重要方法同样是Page对象,在DAO类里做的操作就是对总记录数和结果list进行赋值


public Page<Record> getRecordPage(Page<Record> page, String loginName, 
      String contactName) { 
    int pageSize = page.getPageSize(); 
    int pageNo = page.getPageNo(); 
    String sql = "select * from " 
        + ContactsManagerDbAdapter.TABLENAME_RECORD 
        + " where (fromUser = ? and toUser = ?) or (fromUser = ? and toUser = ?)" 
        + " Limit " + String.valueOf(pageSize) + " Offset " 
        + String.valueOf(pageNo * pageSize); 
    String[] selectionArgs = { loginName, contactName, contactName, 
        loginName }; 
    Cursor cursor = mSQLiteDatabaseWritable.rawQuery(sql, selectionArgs); 
    List<Record> result = new ArrayList<Record>(); 
    for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()){ 
      Record record = new Record(); 
      record.setrId(cursor.getInt(0)); 
      record.setFromUser(cursor.getString(1)); 
      record.setToUser(cursor.getString(2)); 
      record.setContent(cursor.getString(3)); 
      record.setrTime(cursor.getString(4)); 
      record.setIsReaded(cursor.getInt(5)); 
      result.add(record); 
    } 
    page.setTotalCount(getRowCount(loginName, contactName)); 
    page.setResult(result); 
    cursor.close(); 
    return page; 
} 
 
public int getRowCount(String loginName, String contactName){ 
    String sql = "select * from " 
      + ContactsManagerDbAdapter.TABLENAME_RECORD 
      + " where (fromUser = ? and toUser = ?) or (fromUser = ? and toUser = ?)"; 
    String[] selectionArgs = { loginName, contactName, contactName,
        loginName }; 
    Cursor cursor = mSQLiteDatabaseWritable.rawQuery(sql, selectionArgs); 
    int count = cursor.getCount(); 
    cursor.close(); 
    return count; 
} 

关于listview的展示和自定义适配器,在此不提起,总之界面上上一页和下一页按钮的点击事件需要刷新listview


public class ChatHistory extends Activity { 
  ListView historyView; 
  Button prevPageBtn; 
  Button nextPageBtn; 
  TextView historyPageTv; 
  Button backChatsHistoryBtn; 
  Button deleteHistoryBtn; 
  List<Record> historyRecordList;  
  Page<Record> page; 
  String loginName; 
  String contactName; 
  ChatHistoryService chatHistoryService; 
  ContactsManagerDbAdapter dbAdapter; 
  private BaseAdapter adapter; 
  private static final int STATUS_CHANGE = 0; 
  private Handler mHandler; 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.chats_history); 
    historyView = (ListView) findViewById(android.R.id.list); 
    prevPageBtn = (Button) findViewById(R.id.chat_prev_page); 
    nextPageBtn = (Button) findViewById(R.id.chat_next_page); 
    historyPageTv = (TextView) findViewById(R.id.history_page); 
    backChatsHistoryBtn = (Button) findViewById(R.id.back_chats_history); 
    deleteHistoryBtn = (Button) findViewById(R.id.delete_history); 
    SharedPreferences sharedata = ChatHistory.this.getSharedPreferences("data", 0); 
    loginName = sharedata.getString("loginName", ""); 
    contactName = getIntent().getStringExtra("contactName"); 
    dbAdapter = new ContactsManagerDbAdapter(getApplicationContext()); 
    dbAdapter.open(); 
    chatHistoryService = new ChatHistoryService(ChatHistory.this);
    page = new Page<Record>(); 
    page.setPageSize(8); 
    page = chatHistoryService.getHistoryPage(page, loginName, contactName, dbAdapter); 
    historyRecordList = page.getResult(); 
    updateTextView(); 
    prevPageBtn.setOnClickListener(prevPageButtonListener); 
    nextPageBtn.setOnClickListener(nextPageButtonListener); 
    backChatsHistoryBtn.setOnClickListener(backButtonListener); 
    deleteHistoryBtn.setOnClickListener(deleteHistoryButtonListener); 
    adapter = new HistoryListAdapter(ChatHistory.this); 
    historyView.setAdapter(adapter); 
    mHandler = new Handler(){  
       public void handleMessage(Message msg) { 
          switch(msg.what){ 
          case STATUS_CHANGE: 
            // 处理UI更新等操作 
            updateUI(); 
          } 
       }; 
    }; 
  } 
  private void updateUI() { 
    //详细的更新 
    adapter.notifyDataSetChanged();// 更新ListView 
    updateTextView(); 
  } 
   
  private void updateTextView(){    
    if(historyRecordList.size() == 0){ 
      historyPageTv.setText(0 + "/" + 0); 
    } else{ 
      historyPageTv.setText(page.getPageNo() + 1 + "/" + page.getTotalPages()); 
    } 
  } 
  public class HistoryListAdapter extends BaseAdapter{ 
    private class RecentViewHolder { 
      TextView sender_context; 
      TextView rTime; 
    } 
    Context context; 
    LayoutInflater mInflater; 
    public HistoryListAdapter(Context context){ 
      this.context = context; 
      mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    @Override 
    public int getCount() { 
      // TODO Auto-generated method stub 
      return historyRecordList.size(); 
    } 
    @Override 
    public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return historyRecordList.get(position); 
    } 
    @Override 
    public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
    } 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      RecentViewHolder holder; 
      if (convertView == null) { 
        convertView = mInflater.inflate(R.layout.message_layout, null); 
        holder = new RecentViewHolder(); 
        holder.sender_context = (TextView) convertView 
            .findViewById(R.id.message_view_sender_content);
        holder.rTime = (TextView) convertView 
            .findViewById(R.id.message_view_timestamp); 
        convertView.setTag(holder); 
      } else { 
        holder = (RecentViewHolder) convertView.getTag(); 
      } 
      Record record = historyRecordList.get(position); 
      if (record != null) { 
        holder.sender_context.setText(record.getFromUser() + ":" + record.getContent()); 
        holder.rTime.setText(record.getrTime()); 
      } 
      return convertView; 
    } 
  } 
   
  OnClickListener prevPageButtonListener = new OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if(page.isHasPre()){ 
        page.setPageNo(page.getPageNo() - 1); 
        historyRecordList = chatHistoryService.getHistoryPage(page, loginName, contactName, dbAdapter).getResult(); 
        Message msg = new Message(); 
        msg.what = STATUS_CHANGE; 
        mHandler.sendMessage(msg);// 向Handler发送消息,更新UI 
      } 
    } 
  }; 
   
  OnClickListener nextPageButtonListener = new OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if(page.isHasNext()){ 
        page.setPageNo(page.getPageNo() + 1); 
        historyRecordList = chatHistoryService.getHistoryPage(page, loginName, contactName, dbAdapter).getResult(); 
        Message msg = new Message(); 
        msg.what = STATUS_CHANGE; 
        mHandler.sendMessage(msg);// 向Handler发送消息,更新UI 
      } 
    } 
  }; 
   
  OnClickListener deleteHistoryButtonListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      // TODO Auto-generated method stub      
    } 
  }; 
   
  OnClickListener backButtonListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      // TODO Auto-generated method stub 
      // 返回到聊天界面 
      finish(); 
      dbAdapter.close(); 
    } 
  }; 
  @Override 
  public boolean onKeyDown(int keyCode, KeyEvent event) { 
    // 按下键盘上返回按钮 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
      finish(); 
      dbAdapter.close(); 
      return true; 
    } else { 
      return super.onKeyDown(keyCode, event); 
    }
  }
}

上一页,下一页所做的操作也就是在判断是否有上一页和下一页的情况下对页号pageNo的加减操作
最后写上ChatHistoryService.java总觉得是多余的


public class ChatHistoryService { 
  Context context; 
  public ChatHistoryService(Context context) { 
    this.context = context; 
  } 
  public Page<Record> getHistoryPage(Page<Record> page, String loginName, 
      String contactName, ContactsManagerDbAdapter dbAdapter) { 
    RecordDao recordDao = new RecordDao(dbAdapter); 
    return recordDao.getRecordPage(page, loginName, contactName); 
  } 
  public int deleteHistory(String loginName, 
      String contactName, ContactsManagerDbAdapter dbAdapter){ 
    RecordDao recordDao = new RecordDao(dbAdapter); 
    return recordDao.deleteHistoryRecord(loginName, contactName); 
  } 
} 

顺带放上XML布局文件吧
chats_history.xml


<?xml version="1.0" encoding="UTF-8"?> 
<!-- 与好友聊天窗口.xml --> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical" android:layout_width="fill_parent" 
  android:layout_height="fill_parent" android:background="@color/white"> 
  <ListView android:id="@android:id/list" android:layout_width="fill_parent" 
    android:layout_height="200dip" android:layout_weight="1" 
    android:transcriptMode="normal" android:fadingEdge="none" 
    android:padding="4px" android:fastScrollEnabled="true" 
    android:smoothScrollbar="false" 
    android:focusable="true" android:dividerHeight="0dip" 
    android:cacheColorHint="#00000000" android:divider="@drawable/divider" /> 
  <!-- 引用聊天内容.xml --> 
  <LinearLayout android:layout_width="fill_parent" 
    android:layout_height="50.0dip" android:orientation="horizontal" 
    android:background="#ccc" android:paddingLeft="3dip" 
    android:paddingTop="3dip"> 
    <Button android:id="@+id/chat_prev_page" 
      android:layout_width="wrap_content" android:layout_height="wrap_content" 
      android:background="@drawable/chat_prev_page" /> 
    <TextView android:id="@+id/history_page" android:layout_width="30.0dip" 
      android:layout_height="25.0dip" android:gravity="center" 
      android:text="1/1"/> 
    <Button android:id="@+id/chat_next_page" android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:background="@drawable/chat_next_page" /> 
    <Button android:id="@+id/delete_history" android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:background="@drawable/delete_history_button" /> 
    <Button android:id="@+id/export_history" android:layout_width="wrap_content" 
      android:layout_height="wrap_content" android:background="@drawable/export_history_button" /> 
    <Button android:id="@+id/back_chats_history" 
      android:layout_width="wrap_content" android:layout_height="wrap_content"  
      android:background="@drawable/back_btn"/> 
  </LinearLayout> 
</LinearLayout>

 message_layout.xml


<?xml version="1.0" encoding="UTF-8"?> 
<!-- 消息内容的展示 --> 
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:orientation="vertical" 
 > 
 <!-- android:background="@drawable/item_style" --> 
  <TextView android:id="@+id/message_view_sender_content" 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    android:autoLink="all" /> 
  <TextView android:id="@+id/message_view_timestamp" 
    android:layout_alignParentRight="true" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:layout_below="@+id/message_view_message" 
    android:layout_gravity="right" /> 
</LinearLayout> 

最后来看看效果吧,别欺负我没贴上数据库建表语句,看下我的POJO类就知道我数据库表怎么建的

希望本文所述对大家的Android程序设计有所帮助。

您可能感兴趣的文章:Android滑动动态分页实现方法Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多Android实现基于滑动的SQLite数据分页加载技术(附demo源码下载)Android App中使用ViewPager实现滑动分页的要点解析Android中实现多行、水平滚动的分页的Gridview实例源码Android之ListView分页加载数据功能实现代码Android实现ListView分页自动加载数据的方法Android提高之SQLite分页读取实现方法Android实现简单的分页效果Android ListView分页功能实现方法Android开发中滑动分页功能实例详解


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯