5.1 分批加载listView中条目

来源:互联网 发布:java设计模式面试 编辑:程序博客网 时间:2024/05/19 14:02
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;
      }
      
      
}


















 
 
 
原创粉丝点击