#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
}
}