0

У меня есть прокручиваемые вкладки в моей панели действий, и на одной из этих вкладок я пытаюсь получить список установленных пользователем приложений и используемых системных приложений, таких как Flipoard, youtube, messaging и т. Д. (в конечном счете в алфавитном порядке)Ошибка ApplicationAdapter при попытке установить установленные приложения

Я стараюсь следовать этим, но у меня есть некоторые ошибки, реализующие его, потому что я использую фрагменты.

How to get a list of installed android applications and pick one to run

http://javatechig.com/android/how-to-get-list-of-installed-apps-in-android

http://techblogon.com/get-installed-applications-list-android-example/

Это то, что я для моего фрагмента:

package com.spicycurryman.getdisciplined10.app; 

import android.app.ProgressDialog; 
import android.content.pm.ApplicationInfo; 
import android.content.pm.PackageItemInfo; 
import android.content.pm.PackageManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 

import com.ibc.android.demo.appslist.app.ApplicationAdapter; 

import java.util.ArrayList; 
import java.util.List; 



public class InstalledAppActivity extends Fragment 
     implements OnItemClickListener { 

    PackageManager packageManager; 
    ListView apkList; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     setHasOptionsMenu(true); 
     View rootView = inflater.inflate(R.layout.user_installed, container, false); 
     packageManager = getActivity().getPackageManager(); 


     /*To filter out System apps*/ 

     apkList = (ListView) rootView.findViewById(R.id.applist); 

     new LoadApplications().execute(); 


     return rootView; 
    } 

    /** 
    * Return whether the given PackageInfo represents a system package or not. 
    * User-installed packages (Market or otherwise) should not be denoted as 
    * system packages. 
    * 
    * @parampkgInfo 
    * @return boolean 
    */ 
/* private boolean isSystemPackage(ApplicationInfo pkgInfo) { 
     return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true 
       : false; 
    }*/ 


// Don't need in Fragment 
/*@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.block, menu); 
    // super.onCreateOptionsMenu(menu,inflater); 
}*/ 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

    } 


    private class LoadApplications extends AsyncTask<Void, Void, Void> { 
     private ProgressDialog pDialog; 
     List<ApplicationInfo> packageList1 = new ArrayList<ApplicationInfo>(); 


     @Override 
     protected Void doInBackground(Void... params) { 
      List<ApplicationInfo> packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); 



      for(ApplicationInfo pi : packages) { 

       packageList1.add(pi); 


      } 

      //sort by application name 

      final PackageItemInfo.DisplayNameComparator comparator = new PackageItemInfo.DisplayNameComparator(packageManager); 

      /*Collections.sort(packageList1, new Comparator<PackageInfo>() { 
       @Override 
       public int compare(PackageInfo lhs, PackageInfo rhs) { 
        return comparator.compare(lhs.applicationInfo, rhs.applicationInfo); 
       } 
      });*/ 

      return null; 
     } 

     @Override 
     protected void onCancelled() { 
      super.onCancelled(); 
     } 

     @Override 
     protected void onPreExecute() { 
      pDialog = new ProgressDialog(InstalledAppActivity.this.getActivity()); 
      pDialog.setMessage("Loading your apps..."); 
      pDialog.show(); 

     } 

     @Override 
     protected void onPostExecute(Void result) { 

      apkList.setAdapter(new ApplicationAdapter(getActivity(), packageList1, packageManager)); 

      if (pDialog.isShowing()){ 
       pDialog.dismiss(); 

     } 


      super.onPostExecute(result); 
     } 


     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
     } 
    } 

} 

и это вот мой ArrayAdapter класс:

package com.ibc.android.demo.appslist.app; 

import android.content.Context; 
import android.content.pm.ApplicationInfo; 
import android.content.pm.PackageManager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.spicycurryman.getdisciplined10.app.R; 

import java.util.List; 
public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo> { 
    private List<ApplicationInfo> appsList = null; 
    private Context context; 
    private PackageManager packageManager; 

    public ApplicationAdapter(Context context, List<ApplicationInfo> textViewResourceId, 
           PackageManager appsList) { 
     super(context, textViewResourceId, appsList); 
     this.context = context; 
     this.appsList = (List<ApplicationInfo>) appsList; 
     packageManager = context.getPackageManager(); 
    } 

    @Override 
    public int getCount() { 
     return ((null != appsList) ? appsList.size() : 0); 
    } 

    @Override 
    public ApplicationInfo getItem(int position) { 
     return ((null != appsList) ? appsList.get(position) : null); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     if (null == view) { 
      LayoutInflater layoutInflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = layoutInflater.inflate(R.layout.snippet_list_row, null); 
     } 

     ApplicationInfo data = appsList.get(position); 
     if (null != data) { 
      TextView appName = (TextView) view.findViewById(R.id.app_name); 
      TextView packageName = (TextView) view.findViewById(R.id.app_package); 
      ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 

      appName.setText(data.loadLabel(packageManager)); 
      packageName.setText(data.packageName); 
      iconview.setImageDrawable(data.loadIcon(packageManager)); 
     } 
     return view; 
    } 
}; 

Это текущая ошибка, которую я получаю.

enter image description here

Я не уверен, что я должен сделать, чтобы устранить эту ошибку и успешно получить список установленных и используемых системных приложений в алфавитном порядке все в фрагменте пользователя.

Что можно сделать о моем подходе и как я могу это достичь?

+0

Посмотрите на последние два параметра вашего конструктора: 'List textViewResourceId, PackageManager appsList'. Учитывая, что идентификаторы являются apt описаниями ожидаемых параметров для конструктора 'super', эти типы имеют смысл? –

ответ

0

Один из аргументов, которые вы передаете конструктору класса super, то есть ArrayAdapter, не соответствует ни одному из конструкторов ArrayAdapter.

Я считаю, что аргумент PackageManager appsList, вы должны передать List<T> appsList в соответствии с заданным конструктором here.

+0

Я не уверен, почему это создало ошибку в моем onPostExecute при настройке моего адаптера –

Смежные вопросы