Показать диалоги прогресса во время загрузки списка - PullRequest
0 голосов
/ 04 июня 2019

Я делаю приложение, которое показывает список приложений. Вот мой код: -

MainActivity.java

import android.app.*;
import android.content.*;
import android.content.pm.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import java.util.*;
import android.graphics.drawable.*;
import android.content.pm.PackageManager.*;

public class MainActivity extends Activity 
{
    ProgressDialog pd;
    List<Drawable> ld;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    pd = new ProgressDialog(this);
    pd.setTitle("Loading...");
    pd.setCancelable(true);
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pd.create();
    pd.show();
    }

    @Override
    protected void onResume()
    {
    super.onResume();
    createlist();
    }


    public void createlist(){
    ld=new ArrayList<Drawable>();
    List<String> 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)
        {}
    }
    ListView lv = (ListView) findViewById(R.id.mainListView1);
    ArrayAdapter aa= new MyAda(this,pl);
        lv.setAdapter(aa);
//pd.dismiss();
        }

    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.listTextView1);
        tv.setText(getItem(position).toString());
        ImageView iv = (ImageView) view.findViewById(R.id.listImageView1);
        iv.setImageDrawable(ld.get(position));
        return view;
    }

    }
}

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

. Скажите, пожалуйста, правильный способ отображения диалога прогресса, когда список загружает данные

Ответы [ 3 ]

1 голос
/ 04 июня 2019

Переместите функцию создания списка в отдельный поток, вы можете использовать для этого асинхронную задачу, показать диалоговое окно 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

0 голосов
/ 04 июня 2019

'добавьте свой код диалога прогресса в функцию createlist () как'

 public void createlist(){

 pd = new ProgressDialog(this);
    pd.setTitle("Loading...");
    pd.setCancelable(true);
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pd.create();
    pd.show();

    ld=new ArrayList<Drawable>();
    List<String> 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)
        {}
    }
    ListView lv = (ListView) findViewById(R.id.mainListView1);
    ArrayAdapter aa= new MyAda(this,pl);
        lv.setAdapter(aa);
          pd.dismiss();
        }

'закрыть ваш диалог в конце этой функции'

«надеюсь, вы получите ответ»

0 голосов
/ 04 июня 2019

Попробуйте переместить createlist(); ниже pd.show(); и удалить onResume

...