Проблема с отображением списков запущенных приложений в представлении списка - PullRequest
0 голосов
/ 23 апреля 2019

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

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 Ответ

0 голосов
/ 23 апреля 2019

Выполните необходимую работу после получения списка из фонового задания.Верните значение List из метода 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 
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...