Переместите функцию создания списка в отдельный поток, вы можете использовать для этого асинхронную задачу, показать диалоговое окно pregress в onPreExecute и отклонить ее при выполнении onPost.
Вставьте код ниже в вашу активность, и она должна работать.
ProgressDialog pd;
List<Drawable> ld;
List<String> pl;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
pd = new ProgressDialog(this);
pd.setTitle("Loading...");
pd.setCancelable(true);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.create();
}
@Override
protected void onResume()
{
super.onResume();
new AsyncTask<Void,Void,Void>(){
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.show();
}
@Override
protected Void doInBackground(Void... voids) {
createlist();
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
pd.dismiss();
ListView lv = (ListView) findViewById(R.id.listView);
ArrayAdapter aa= new MyAda(Main3Activity.this,pl);
lv.setAdapter(aa);
}
}.execute();
}
public void createlist(){
ld=new ArrayList<Drawable>();
pl= new ArrayList<String>();
PackageManager pm= getPackageManager();
List<ApplicationInfo> l = pm.getInstalledApplications(PackageManager.GET_META_DATA);
for(ApplicationInfo ai:l){
String name= ai.packageName.toString();
pl.add(name);
try
{
Drawable d = getApplicationContext().getPackageManager().getApplicationIcon(name);
ld.add(d);
}
catch (PackageManager.NameNotFoundException e)
{}
}
}
class MyAda extends ArrayAdapter{
public MyAda(Context c, List val){
super(c,R.layout.list,val);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater li= LayoutInflater.from(getApplicationContext());
View view = li.inflate(R.layout.list,null);
TextView tv = (TextView) view.findViewById(R.id.txt);
tv.setText(getItem(position).toString());
ImageView iv = (ImageView) view.findViewById(R.id.iv);
iv.setImageDrawable(ld.get(position));
return view;
}
}
Вы не видели диалоговое окно прогресса с вашим кодом, потому что вы отображаете диалоговое окно прогресса и извлекаемые данные приложения как в основном потоке, так и в основном потоке одновременно может выполняться только одно.Рекомендуется всегда переносить любую тяжелую работу в фоновый поток для обеспечения плавного пользовательского интерфейса и повышения производительности.Также асинхронная задача не является bset-способом для многопоточности, пожалуйста, обратитесь https://medium.com/@maheswaranapk/android-threading-introduction-90e91e196600