Диалог прогресса в GridView - PullRequest
4 голосов
/ 28 января 2012

Мой код выглядит следующим образом:

public class wall extends Activity {
GridView webgridview;
Button web;

ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.wall);

pd = ProgressDialog.show(wall.this,"Loading", "Please Wait...",true);
                new Thread() {
                    public void run() {
                    try {
webgridview.setAdapter(new WebImageAdapter(wall.this));
}catch(Exception e)
{
}
handler.sendEmptyMessage(0);
pd.dismiss();
}
}.start();
private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        Toast.makeText(wall.this, "finished", 1).show();
    }
};

А мой класс адаптера выглядит следующим образом. Я кодирую диалог прогресса только в вышеуказанном классе.

public class WebImageAdapter extends BaseAdapter {
private Context mContext;
public static String[] myRemoteImages = {
    "http://www.evergreenhits.com/ad/wallpapers/3d_1.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_2.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_3.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_4.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_5.jpg"
        };

public WebImageAdapter(Context c) {
    mContext = c;
}

public int getCount() {
    //return animals.length;
     return this.myRemoteImages.length;

}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

// create a new ImageView for each item referenced by the Adapter
public ImageView getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    imageView = new ImageView(mContext);
    if (convertView == null) {

        imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

        imageView.setPadding(8, 8, 8, 8);
  } else {
        imageView = (ImageView) convertView;
    }

try { 
URL aURL = new URL(myRemoteImages[position]); 
URLConnection conn = aURL.openConnection(); 
conn.connect(); 
InputStream is = conn.getInputStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 
Drawable d=Drawable.createFromStream(bis, "src Name");

bis.close(); 
is.close(); 
imageView.setImageDrawable(d); 
} catch (IOException e) { 
Log.e("DEBUGTAG", "Remote Image Exception", e); 
} 

imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
imageView.setLayoutParams(new GridView.LayoutParams(150, 150)); 
    return imageView;
}

Диалог прогресса не работает должным образом. Он показывает и внезапно исчезает перед изображениями, загруженными в gridview. Пожалуйста, помогите мне как можно скорее.

Ответы [ 2 ]

3 голосов
/ 28 января 2012

Использование AsyncTask:

вызов:

dialog=ProgressDialog.show(wall.this,"Loading", "Please Wait...",true);
        doback dob=new doback();
        dob.execute();

Класс

class doback extends AsyncTask<URL, Integer, Long>
    {

        @Override
        protected Long doInBackground(URL... arg0) 
        {
            try
            {
                        //getImagepaths from Server
            }
            catch(Exception e)
            {

            }
            return null;
        }
        protected void onProgressUpdate(Integer... progress) 
        {

        }
        protected void onPostExecute(Long result) 
        {
            try
            {
                webgridview.setAdapter(new WebImageAdapter(wall.this));

                dialog.dismiss();
            }
            catch(Exception e)
            {
                e.printStackTrace();
                dialog.dismiss();
            }
        }
    }

Код адаптера выглядит примерно так:

class WebImageAdapter extends BaseAdapter{

//      @Override
        public int getCount() {

        return names.length;
        }

//      @Override
        public Object getItem(int position) {

        return null;
        }

//      @Override
        public long getItemId(int position) {

        return 0;
        }

//      @Override
        public View getView(int pos, View convertView, ViewGroup parent) {
        View row=getLayoutInflater().inflate(R.layout.nameitem,null);
        ImageView image=(ImageView)row.findViewById(R.id.image);

        image.setImageBitmap(convertImage(myRemoteImages[position]))// convertImage is to convert url to bitmap
        return row;
        }

        }

Редактировать- Из Документация для разработчиков Android: ProgressDialog

Этот класс устарел на уровне API 26.

ProgressDialog это модальное диалоговое окно, которое не позволяет пользователю взаимодействовать с приложением.Вместо использования этого класса вы должны использовать индикатор прогресса, такой как ProgressBar , который может быть встроен в пользовательский интерфейс вашего приложения.Кроме того, вы можете использовать уведомление , чтобы информировать пользователя о ходе выполнения задачи.

0 голосов
/ 28 января 2012

setAdapter (), не занимайте больше времени, его getView () класса Adapter при каждом обращении к сети и отнимает время. Поэтому использование progressDialog в setAdapter не подходит. При прокрутке ваших сеток использование кода заняло много времени, так как getView () автоматически вызывается при просмотре прокрутки.

у вас должна быть ссылка LazyList для загрузки изображения из Интернета и размещения его в ImageView.

...