2

私のアプリでは、インストールされているアプリケーションをリストビューに一覧表示する必要があります。アプリは、インストールされたアプリをバックグラウンドスレッドでフェッチします。要件は、フェッチが完了していなくてもリストにデータを入力することです。つまり、arraylistにエントリが1つある場合は、そのアイテムを含むarraylistを表示します。これは可能ですか?助けてください。よろしくお願いします。

4

3 に答える 3

2

まず、これは、アプリケーションデータをバックグラウンドで処理するためにループを使用する場合にのみ可能です。アウトライン:

アプリ情報を保持するクラス:

Class AppData {
  public final Drawable icon;
  public final String   name;

  public AppData(Drawable i, String n){
     this.icon = i;
     this.name = n;
  }    
}

アプリを検索するためのAsynckTask:

AsyncTask<Void,AppData,Void> scanAppsTask = new AsyncTask<Void,AppData,Void>{

  @Override
  public Void doInBackground(Void... args){

     //--get list---
     List<ApplicationInfo> apps = mPm.getInstalledApplications(
            PackageManager.GET_UNINSTALLED_PACKAGES |
            PackageManager.GET_DISABLED_COMPONENTS);

     //--run a loop--
     for(ApplicationInfo appInfo : apps){

       AppData newFound;

       //---find app details, load app icon etc---

       publishProgress(newFound);

     }

     //---done---
     return null;
  }

  @Override
  public void onProgressUpdate(AppData... data){
    //---update list for every app found----
    myListAdapter.add(data[0]);
    myListAdapter.notifyDataSetChanged();
  }
}

scanAppsTask.execute();
于 2012-11-14T08:27:52.563 に答える
1

私は同様のアプリに取り組んでいました。そこでは、インストールされているすべてのアプリケーション(組み込みのアプリケーションも含む)をフェッチする必要があります。私は次のコードでこれを行いました、

TextView data;
    ImageView image1;
    LinearLayout holdlayout;
    View l1;
    private ArrayList results = new ArrayList();
    List<ResolveInfo> list;
    TextView result;
    String str="";
    Drawable icon;
      @Override
      public void onCreate(Bundle savedInstanceState) 
      {
          super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            l1 = findViewById(R.id.Layout1);
        PackageManager pm = this.getPackageManager();
        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        list = pm.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED);
        for (ResolveInfo rInfo : list)
        {
            str = rInfo.activityInfo.applicationInfo.loadLabel(pm).toString() + "\n";
           results.add(rInfo.activityInfo.applicationInfo.loadLabel(pm).toString());
           Log.w("Installed Applications", rInfo.activityInfo.applicationInfo.loadLabel(pm).toString());
           icon =  rInfo.activityInfo.applicationInfo.loadIcon(pm);
           holdlayout = new LinearLayout(getApplicationContext());
            holdlayout.setOrientation(LinearLayout.HORIZONTAL);
            data = new TextView(getApplicationContext());
            data.setText(str);
            image1 = new ImageView(getApplicationContext());
            image1.setBackgroundDrawable(icon);
            ((ViewGroup) holdlayout).addView(image1);
            ((ViewGroup) holdlayout).addView(data);
            ((ViewGroup) l1).addView(holdlayout);

        }
      }

このコードに問題がある場合はお知らせください。

于 2012-11-14T07:49:58.153 に答える
1

のアダプタにアイテムを動的に追加/削除できるListViewので、新しいアイテムが利用可能になり次第、バックグラウンドスレッドからアイテムを1つずつリストに追加できます。

于 2012-11-14T07:57:56.667 に答える