Проблема с отображением списков запущенных приложений в представлении списка

#java #android #android-listview #android-arrayadapter

#java #Android #android-listview #android-arrayadapter

Вопрос:

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

AppAdapter:

 public class AppAdapter extends ArrayAdapter<String> {


private List<ActivityManager.RunningServiceInfo> applist =null;
private Context context;
private PackageManager packageManager;
private List<String> applist1 = null;

public AppAdapter(@NonNull Context context, int resource, @NonNull List<String> objects) {
    super(context, resource, objects);

    this.context = context;
    this.applist1 = objects;
    packageManager = context.getPackageManager();
}

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


@Override
public String getItem(int position) {
    return ((applist1 != null) ? applist1.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 (view == null) {
        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate(R.layout.list_item, null);
    }

    ActivityManager.RunningServiceInfo data = applist.get(position);
    Log.d("Test", "data is  : "   data);

    if (data != null){
        Log.d("Test", "data is not null : "   data);
        TextView appName = view.findViewById(R.id.applabel);
        TextView packageName = view.findViewById(R.id.pname);
        ImageView iconView = view.findViewById(R.id.appicon);

        ComponentName mComponentName = data.service;
        appName.setText(mComponentName.getClassName());
        packageName.setText(mComponentName.getPackageName());

    } else {
        Log.d("Test", "data is null : "   data);

    }
    return view;
}
}
  

Код в основном действии:

 private class LoadApplications extends AsyncTask<Void, Void, Void>{

    private ProgressDialog progressDialog = null;

    @Override
    protected Void doInBackground(Void... voids) {

         applist1 = runningServices();
        listadapter = new AppAdapter(Taskmanager.this, R.layout.list_item, applist1);
        Log.d("Test", "applist1 is : "   applist1);
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {

        listView.setAdapter(listadapter);
        progressDialog.dismiss();
        super.onPostExecute(aVoid);
    }

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(Taskmanager.this, null, "Loading..");
        super.onPreExecute();
    }
}
  

и runningServices() метод правильно возвращает список имен пакетов (если вы хотите это увидеть, дайте мне знать).

Проблема в том, что после запуска приложения оно ничего не показывает (нет списка). Я не забыл вызвать асинхронную задачу в методе onCreate действия.

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

Ответ №1:

Выполните необходимую работу после получения списка из фоновой задачи. Верните значение списка из метода doInBackgroind, а затем назначьте его адаптеру в методе onPostExecute, который выполняется в потоке пользовательского интерфейса.

 public class LoadApplications extends AsyncTask<Void, Void, List<ActivityManager.RunningServiceInfo>> {

        @Override
        protected List<ActivityManager.RunningServiceInfo> doInBackground(Void... arg0) {
              return runningServices();
        }

        @Override
        protected void onPostExecute(List<ActivityManager.RunningServiceInfo> applist) {
                  // call super
                   listadapter = new AppAdapter(Taskmanager.this, 
                   R.layout.list_item, applist);

                  listView.setAdapter(listadapter);
                  progressDialog.dismiss();

                  //other works 
        }
    }