5.1 分批加载listView中条目

本文介绍如何在Android应用中实现黑名单号码的分页加载功能,并为ListView设置滚动监听事件来动态加载更多数据。文章详细展示了数据库访问层中查询黑名单号码的方法、主活动中ListView的配置及滚动监听事件的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在数据库访问dao层中,创建查询部分黑名单的方法
2.给listview设置setOnScrollListener监听事件
3. 完成监听事件内部实现 类中未实现的方法

 
 
 
 
1.在数据库访问dao层中,创建查询部分黑名单的方法


      /**
       * 查询部分黑名单号码
       *   @param   currentNumber   从哪条记录开始
       *   @param   maxNumber    最多获取多少条数据
       *   @return
       */
       public   List<BlackNumberBean>   getPraNumberInfo(   int   currentNumber, int   maxNumber){
            
               try   {
                  Thread. sleep(600); 
            }   catch   (InterruptedException e) {
                  e.printStackTrace();
            }
            
            List<BlackNumberBean>  numberList=   new   ArrayList<BlackNumberBean>();
            SQLiteDatabase db =   helper .getWritableDatabase();
               //Cursor cursor = db.rawQuery("select * from blacknumber limit ?,? ",new String[]{String.valueOf(currentNumber),String.valueOf(maxNumber)});
            Cursor cursor = db.rawQuery(   "select * from blacknumber  limit ? offset ?" ,   new   String[] {
                        String. valueOf(maxNumber), String.valueOf(currentNumber) });
            
               while (cursor.moveToNext()){
                  BlackNumberBean  numberBean=   new   BlackNumberBean();
                  numberBean.setId(cursor.getInt(cursor.getColumnIndex(   "id" )));
                  numberBean.setNumber(cursor.getString(cursor.getColumnIndex(   "number" )));
                  numberBean.setMode(cursor.getString(cursor.getColumnIndex(   "mode" )));
                  
                  numberList.add(numberBean);
                  
            }
          db.close();
               return   numberList;
      }
      
      
      
       /**
       * 查询所有黑名单个数
       *   @return
       */
       public   int   getMaxNumber(){
               int   total=0;
            SQLiteDatabase db =   helper .getWritableDatabase();
            Cursor cursor = db.rawQuery(   "select * from blacknumber" ,   null );
            total=cursor.getCount();    //得到数据库有多少条记录
          db.close();
               return   total;
      }




-----------------------------------------------------------------------------------------------
2.给listview设置setOnScrollListener监听事件
3. 完成监听事件内部实现 类中未实现的方法



public   class   CallSmsSafeActivity   extends   Activity {

       private   String   TAG =   "CallSmsSafeActivity" ;
       private   ListView  lv_callsms_safe   ;
       private   BlackNumberDao   dao ;
       private   BlackNumberBean   blackNumberBean ;
       private   List<BlackNumberBean>   numberList   ;
       private   TextView    tv_number ;
       private   TextView    tv_mode ;
       private   ImageView   iv_delete ;
      
       private   MyAdapter    adpter ;
       private   LinearLayout     loading ;
       private       int   currentNumber =0;     //分页参数
       private       int   maxNumber =20;
       private     int   totalCount ;
      
       private   boolean   loadingflag ;
       /**
       * 创建消息处理机制
       */
       private   Handler   handler =   new   Handler() {
            
               @Override
               public   void   handleMessage(Message msg) {
                     super .handleMessage(msg);
                  Log. i( TAG   ,   "主线程跟新界面"   );
                  
                     loading .setVisibility(View.   GONE );    //加载到布局时移除
                      if (   adpter ==   null ){
                                 adpter =   new   MyAdapter();
                                 lv_callsms_safe .setAdapter(   adpter );
                        }   else {
                                 //复用旧的数据适配器,通知数据适配器数据跟新了
                                 adpter .notifyDataSetChanged();
                  
                        
                           loadingflag =   false ;   //标记已加载完
                  }
                  
            }
      };
      
      
      
       @Override
       protected   void   onCreate(Bundle savedInstanceState) {
               super .onCreate(savedInstanceState);
            setContentView(R.layout.   activity_callsms_safe );
            
               lv_callsms_safe =( ListView) findViewById(R.id. lv_callsms_safe   );
            
               loading =(LinearLayout) findViewById(R.id.   loading );
               loading .setVisibility(View.   VISIBLE );      //加载布局可见
            
               dao =   new   BlackNumberDao(   this );     //首次加载数据
            fillDate();
               totalCount =   dao .getMaxNumber();
            Log. i( TAG   ,   "数据库总条目数:"   + totalCount   );
            
             //给lv 注册滚动监听事件
               lv_callsms_safe .setOnScrollListener(   new   OnScrollListener() {
                  
                     // 滚动状态发生改变的时候 调用的方法
                     @Override
                     public   void   onScrollStateChanged(AbsListView view,   int   scrollState) {
                           switch   (scrollState) {
                           case   OnScrollListener.   SCROLL_STATE_IDLE :   // listview静止状态
                                 // 获取最后一个可见条目对应的集合里面数据的位置. 从0开始
                                 int   lastPosition =   lv_callsms_safe .getLastVisiblePosition();
                                 // 获取集合的大小 从1开始
                                 int   total =   numberList .size();
                        
                                 if   (lastPosition == (total - 1)) {
                                    Log. i( TAG   ,   "拖动到了最后一个条目,加载更多的数据..."   );
                                       if   (   loadingflag ) {
                                          Toast. makeText(getApplicationContext(),   "正在加载数据." ,0).show();
                                          
                                    }
                                       currentNumber   +=   maxNumber ;
                                       if   (   currentNumber   >=   totalCount   ) {
                                          Toast. makeText(getApplicationContext(),   "没有更多的数据了" ,0).show();
                                             return ;
                                    }

                                    fillDate();
                              }

                                 break ;
                              
                                 cas e   OnScrollListener. SCROLL_STATE_TOUCH_SCROLL     //手指触摸滚动
                              
                                 break ;
                   case   OnScrollListener.   SCROLL_STATE_FLING   //手指已经离开 惯性滑翔状态
                              
                                 break ;      

                        }
                        
                        
                        
                  }
                  
                     //滚动的时候调用的方法
                     @Override
                     public   void   onScroll(AbsListView view,   int   firstVisibleItem,
                                 int   visibleItemCount,   int   totalItemCount) {
                        
                        
                  }
            });
            
      }


       /**
       * 查询数据
       */
       private   void   fillDate() {
            
               loadingflag =   true ;     //标记正在加载数据
            
               new   Thread(){
                  
                     public   void   run() {
                           //numberList=dao.getPraNumberInfo(currentPage, pageSize);
                        
                           if   (   numberList   ==   null ) {
                                 numberList   =   dao .getPraNumberInfo(   currentNumber ,   maxNumber );
                        }   else   {
                                 numberList .addAll(   dao .getPraNumberInfo(   currentNumber ,   maxNumber ));
                        }
                           handler .sendEmptyMessage(0);
                        
                  };
                  
            }.start();
            
      }
      
      
       /**
       * 创建适配器
       */
       public   class   MyAdapter    extends   BaseAdapter{

            
               @Override
               public   int   getCount() {
                  
                     return   numberList .size();
            }
            
            
               @Override
               public   View getView(   int   position, View convertView, ViewGroup parent) {
                  
                     //复用历史缓存view对象,减少内存消耗,防止内存溢出
                  View view=   null ;
                  ViewHolder holder=   null ;
                  
                     if (convertView!=   null &&convertView   instanceof   RelativeLayout){     //RelativeLayout:填充view的布局类型
                        view=convertView;
                        Log. i( TAG   ,   "复用历史缓存view:"   +position);
                        
                        holder=(ViewHolder) view.getTag();     //复用孩子的id
                        
                  }   else {
                        view = View. inflate(getApplicationContext(), R.layout. list_callsms_item , null   );
                        Log. i( TAG   ,   "创建新的view对象:"   +position);
                        
                        holder=   new   ViewHolder();     //初始化view持有者
                        
                           //只是在创建view的时候去寻找控件,然后把控件的id存起来
                        holder.   tv_number =(TextView) view.findViewById(R.id. tv_number   );
                        holder.   tv_mode =(TextView) view.findViewById(R.id. tv_mode   );
                        holder.   iv_delete =(ImageView) view.findViewById(R.id. iv_delete   );
                        
                        view.setTag(holder);     //将holder存到view中
                  }
                  
                     //非常消耗内存
                     //View view = View.inflate(getApplicationContext(), R.layout.list_callsms_item,null);
                  
                  
                     blackNumberBean   =   numberList .get(position);
                   holder.   tv_number .setText(   "号码:" + blackNumberBean   .getNumber());
                   String mode=   blackNumberBean .getMode();
                     if (   "1" .equals(mode)){
                         holder.   tv_mode .setText(   "电话拦截" );
                   }   else   if (   "2" .equals(mode)){
                         holder.   tv_mode .setText(   "短信拦截" );
                   }   else   if (   "3" .equals(mode)){
                         holder.   tv_mode .setText(   "全部拦截" );
                   }
                  
                     return   view;
            }

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

               @Override
               public   long   getItemId(   int   position) {
                  
                     return   0;
            }
            
            }
      
      
      
       /**
       * 创建view持有者,将需要找的控件的应用放在 viewholder
       */
       static   class   ViewHolder{
            
            TextView       tv_number ;
            TextView       tv_mode ;
            ImageView     iv_delete ;
      }
      
      
}


















 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值