由于ListView在滑动过程中需要不停的接受广播,根据广播消息修改ListView中数据的状态,比如更新进度条。。
然后再不断滑动的过程中,刚开始滑动时候不会卡,到后来就一直会很卡。有没有好点的办法,尝试再滑动时,禁止发送端发送广播,并不可行,而且发送端的控制暂停发送的机制有bug,不一定能停止发送。public View getView(int position, View convertView, ViewGroup parent) {
if(!onRegister)
{
registerProgressChangeReceiver();//注册接受广播
}
    View childView;
    ExpandableListBackupHolder backupHolder = null;
        if (convertView == null) {
         Log.d("DLL","sjfsjfjs00000000000000000000000000");
            childView = this.mInflater.inflate(this.mChildResourceId, parent, false);
            mAllChildView.add(childView);
            backupHolder = new ExpandableListBackupHolder();
mAllBackupHolder.add(backupHolder);
backupHolder.appName = (TextView) childView.findViewById(R.id.local_backup_name);
backupHolder.backupProgress = (ProgressBar) childView.findViewById(R.id.local_backup_progress);
backupHolder.checkBox = (ImageView) childView.findViewById(R.id.data_local_checkbox);
backupHolder.backupStatus = (TextView) childView.findViewById(R.id.local_backup_status);
backupHolder.backupStatus.setText(context.getString(R.string.text_waiting));
backupHolder.backupProgress.setMax(100);
childView.setTag(backupHolder);
if(stopBackupOrRestore)
{
Log.d("DLL","position 1111====" + position);
Log.d("DLL","backupOrRestore  =  " + backupOrRestore);
backupHolder.checkBox.setVisibility(View.VISIBLE);
backupHolder.checkBox.setImageResource(R.drawable.can_not_select);
if(backupOrRestore.equals("backup"))
{
backupHolder.backupStatus.setText(R.string.backup_fail);
}
else if(backupOrRestore.equals("restore"))
{
backupHolder.backupStatus.setText(R.string.restore_fail);
}
}

                  else {
            //childView = convertView;
           // backupHolder = (ExpandableListBackupHolder) childView.getTag();
           // backupHolder.backupProgress = (ProgressBar)childView.findViewById(R.id.local_backup_progress);
            //backupHolder.backupProgress.setVisibility(View.GONE);
            if(position >= mAllBackupHolder.size())
                {
             childView = this.mInflater.inflate(this.mChildResourceId, parent, false);
             mAllChildView.add(childView);
             backupHolder = new ExpandableListBackupHolder();
             mAllBackupHolder.add(backupHolder);
            
backupHolder.appName = (TextView) childView.findViewById(R.id.local_backup_name);
backupHolder.backupProgress = (ProgressBar) childView.findViewById(R.id.local_backup_progress);
backupHolder.checkBox = (ImageView) childView.findViewById(R.id.data_local_checkbox);
backupHolder.backupStatus = (TextView) childView.findViewById(R.id.local_backup_status);
backupHolder.backupStatus.setText(context.getString(R.string.text_waiting));

Log.d("DLL","sjfsjfjsfj11111111222222222222222222222222    =" + stopBackupOrRestore);
if(stopBackupOrRestore)
{
Log.d("DLL","position 2222====" + position);
Log.d("DLL","backupOrRestore  =  " + backupOrRestore);
backupHolder.checkBox.setVisibility(View.VISIBLE);
backupHolder.checkBox.setImageResource(R.drawable.can_not_select);
if(backupOrRestore.equals("backup"))
{
backupHolder.backupStatus.setText(R.string.backup_fail);
}
else if(backupOrRestore.equals("restore"))
{
backupHolder.backupStatus.setText(R.string.restore_fail);
}
}
                }
            else
            {
             Log.d("DLL","sjfsjfjs3333333333333333333333");
             childView = mAllChildView.get(position);
             backupHolder = mAllBackupHolder.get(position);
backupHolder.appName = (TextView) childView.findViewById(R.id.local_backup_name);
backupHolder.backupProgress = (ProgressBar) childView.findViewById(R.id.local_backup_progress);
backupHolder.checkBox = (ImageView) childView.findViewById(R.id.data_local_checkbox);
backupHolder.backupStatus = (TextView) childView.findViewById(R.id.local_backup_status);
            }

        }
        
//             childView = this.mInflater.inflate(this.mChildResourceId, parent, false);
//             backupHolder = new ExpandableListBackupHolder();
// childView.setTag(backupHolder);
        
        String dataInfo = this.mUserDataName.get(position);
        backupHolder.appName = (TextView) childView.findViewById(R.id.local_backup_name);
        backupHolder.appName.setText(dataInfo);
//         backupProgress = (ProgressBar) childView.findViewById(R.id.local_backup_progress);
//         backupHolder.backupProgress.setMax(100);
//         checkBox = (ImageView) childView.findViewById(R.id.data_local_checkbox);
//         backupStatus = (TextView) childView.findViewById(R.id.local_backup_status);
//         backupHolder.backupStatus.setText(context.getString(R.string.restore_complete));
    
        Log.i(TAG, "backupProgress---->"+backupProgress);
        if(list.size() > 0 ){
         Log.i(TAG, "list" + position);
        
mapProcess.put(list.get(position).getComponentName(), backupHolder.backupProgress);
Log.d("NAME","appName ===" +list.get(position).getComponentName()+"  processBar == "+backupHolder.backupProgress);
mapImageView.put(list.get(position).getComponentName(), backupHolder.checkBox);

mapTextView.put(list.get(position).getComponentName(), backupHolder.backupStatus);
        }
        
return childView;
}

解决方案 »

  1.   

    每绘制一个item就会调用一次getView方法,你每调用getView一次,就注册一个广播。不卡屏才怪。广播注册一个就行了,发送广播需要多次
      

  2.   

    没错 listView慢的话 getView代码肯定有问题 你这个getView貌似有点复杂了 精简一下
      

  3.   

    代码太冗余了。看不大懂。
    你想实现什么功能以至于用到广播?如果只是更新进度条和改变listview中数据的话,完全不需要用到广播。
    你往下滑发送广播,往上滑需要发送广播,滑到哪广播发到哪,不占内存才怪,不卡才怪
      

  4.   

    兄弟 你的getView里面可以少做点事不
      

  5.   


    是的 整个机制有问题,整个机制是这样的: 后台起一个线程,线程中处理数据,当处理数据的时候,通过handler将当前的数据传入主线程,并在主线程中发送广播,通过广播接收界面进度条的长度百分比。
    这样做我觉得很有问题,但是这不是我做的,我是改正别人bug的,如果要机制需要动的东西比较多,项目吃紧暂时不准备动