2011-05-16 47 views
1

我正在加载列表视图,列出了手机上已安装的所有应用程序。我希望应用程序在加载列表视图时显示不确定的进度条(旋转的圆形)。ListView加载时无法显示不确定的ProgressBar

 final PackageManager pm = this.getPackageManager(); 

    Intent intent = new Intent(Intent.ACTION_MAIN, null); 
    intent.addCategory(Intent.CATEGORY_LAUNCHER); 

    final ArrayList<ResolveInfo> list = 
      (ArrayList<ResolveInfo>) pm.queryIntentActivities(intent, 
        PackageManager.PERMISSION_GRANTED); 
    for (ResolveInfo rInfo : list) 
    { 
     Log.i(TAG, ": Installed Applications " + rInfo.activityInfo. 
       applicationInfo.loadLabel(pm).toString()); 
    } 

    final ArrayAdapter<ResolveInfo> adapter = 
     new ArrayAdapter<ResolveInfo>(this, R.layout.list_item, list) 
     { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      if (convertView == null) 
       convertView = LayoutInflater.from(parent.getContext()). 
        inflate(R.layout.list_item, parent, false); 

      final String text = list.get(position).activityInfo. 
       applicationInfo.loadLabel(pm).toString(); 
      ((TextView)convertView.findViewById(R.id.text)).setText(text); 

      final Drawable drawable = list.get(position).activityInfo.applicationInfo.loadIcon(pm); 
      ((ImageView)convertView.findViewById(R.id.image)).setImageDrawable(drawable); 

      return convertView; 
     } 

     }; 
    setListAdapter(adapter); 

    ListView lv = getListView(); 
    lv.setEmptyView(findViewById(R.id.empty)); 
    lv.setTextFilterEnabled(true); 

继承人的XML:

<?xml version="1.0" encoding="utf-8"?> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ImageView android:id="@+id/image" 
     android:layout_width="50dp" android:layout_height="50dp" /> 
    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" android:layout_height="wrap_content" 
     android:padding="10dp" android:textSize="16sp" /> 

<ScrollView 
      android:id="@+id/empty" android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
      <ProgressBar android:id="@+id/progressBar1" android:layout_width="wrap_content" 
      android:layout_height="wrap_content"></ProgressBar> 

     </ScrollView> 

</LinearLayout> 

不显示任何内容,而ListView控件加载....我究竟做错了???

+0

如何加载数据?如何看起来空视图? – pawelzieba 2011-05-16 21:10:01

+0

你调用lv的列表视图,但它是XML中的滚动视图?需要更多解释 – Blundell 2011-05-16 21:12:11

+0

ListView不是ScrollView。所以,我对你的代码有点困惑。 – 2011-05-16 21:16:05

回答

2

我想你需要异步加载数据:

  1. 在做初始设置只设置该活动的主要ListView和设置空视图
  2. 写一个AsyncTask(链接here)它会异步加载数据,并在您的适配器完成时填充您的适配器
  3. 在初始设置后启动您的AsyncTask
  4. 执行任务期间,您的emp ty视图(进度条)应该显示,任务完成时,应该填充ListView
+0

感谢您的可能解决方案...你确定AsyncTask是实现这一目标的唯一方法吗?我希望有一个更简单的解决方案。 – 2011-05-16 22:54:35

+1

我的理论是你在UI线程中加载数据,所以它基本上锁定了线程并禁止正确显示进度条。所以是的,我认为做到这一点的唯一方法是在单独的线程上执行初始数据加载。 AsyncTask非常易于使用。你只需要重写几个方法来获得工作实现。 – 2011-05-17 16:57:17

+0

如果从不同的线程填充listview的适配器,则适配器将抛出illegalstateexception,说不能从不同的线程加载数据。对? – Enigma 2013-08-12 11:19:14

相关问题