2014-04-01 3 views
0

В одном из моих приложений мне нужно использовать AsyncTask. Мне нужно получить URL-адрес изображения с HTTP-сайта. Я сделал это в методе doInBackground. Я получаю URL-адрес этого изображения в виде строки.android adapter from async task

publishProgress(thumb);//thumb is string 

затем в

 @Override 
     protected void onProgressUpdate(String... values) { 

      super.onProgressUpdate(values); 
      sample = new ArrayList<String>(); 

      System.out.println("this is on progress..."+values[0]); 
      sample.add(values[0]); 

      GridviewAdapter_old go=new GridviewAdapter_old(getActivity(), sample); 

      gv.setAdapter(go); 
      //   gv.setAdapter(ga); 
     } 

public class GridviewAdapter_old extends BaseAdapter 

{ 

    private ArrayList<String> listCountry; 

    private Activity activity; 

    public GridviewAdapter_old(Activity activity, ArrayList<String> listCountry) { 
     super(); 

     // this.listCountry = listCountry; 
     this.listCountry = new ArrayList<String>(); 
     this.listCountry = listCountry; 
     // this.listFlag = listFlag; 
     this.activity = activity; 
     System.out.println("this is contry name " + this.listCountry); 
     // System.out.println("this is img name " + this.listFlag); 
     // System.out.println(); 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     System.out.println("len " + listCountry.size()); 
     // return listCountry.size(); 
     return listCountry.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     // TODO Auto-generated method stub 
     return listCountry.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public static class ViewHolder { 
     public ImageView imgViewFlag; 
     // public TextView txtViewTitle; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     // TODO Auto-generated method stub 
     ViewHolder view; 
     LayoutInflater inflator = activity.getLayoutInflater(); 

     if (convertView == null) { 
      view = new ViewHolder(); 
      convertView = inflator.inflate(R.layout.test, null); 

      view.imgViewFlag = (ImageView) convertView 
        .findViewById(R.id.grid_item_image); 

      // view.imgViewFlag.setBackgroundResource(R.drawable.view_default); 
      convertView.setTag(view); 

     } 

     else { 

      view = (ViewHolder) convertView.getTag(); 
     } 
     try { 
      URL myUrl = new URL(listCountry.get(0)); 
      InputStream inputStream = (InputStream) myUrl.getContent(); 
      Drawable drawable = Drawable.createFromStream(inputStream, null); 
      view.imgViewFlag.setImageDrawable(drawable); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 

     } 
     /* 
     * Bitmap imageBitmap = null; //System.gc(); try { URL imageURL = new 
     * URL(listCountry.get(0)); 
     * System.out.println("this is in last portion..." 
     * +listCountry.get(position)); imageBitmap = 
     * BitmapFactory.decodeStream(imageURL.openStream()); 
     * view.imgViewFlag.setImageBitmap(imageBitmap); // 
     * view.txtViewTitle.setText(listCountry.get(position)); // 
     * view.imgViewFlag.setImageResource(listFlag.get(position)); 
     * 
     * } catch (Exception e) { System.out.println("this is error " + 
     * e.getMessage()); } 
     */ 

     return convertView; 
    } 

} 

Проблема заключается в том:

  • Я не получаю изображение из URL (что получает от большого пальца (publishProgress(thumb);)
  • Я не получаю несколько изображений.

ответ

1

Вы получаете только один из своих списков, потому что каждый раз, когда вы звоните onProgressUpdate, вы создаете новый список.

Вы не хотите использовать onProgressUpdate для заполнения вашего списка, это будет безумное количество накладных расходов. Вместо этого вы хотите создать свой список внутри doInBackground, затем передайте этот список на ваш onPostExecute, затем поместите новый список в адаптер и вызовите notifyDatasetChanged на адаптере, чтобы обновить список.

Короче говоря, создать адаптер (широкий класс переменных), создать ArrayList (широкий класс переменных), и каждый раз изменение производится в список все, что вам нужно сделать, это вызов notifyDatasetCHanged на адаптере

ArrayList<String> list = new ArrayList<String(); 
ArrayAdapter adapter; 

public class AsyncTask..... 

@Override 
protected Void doInBackground(Void... params){ 
    ... 
    list.add(stuff); 
} 

@Override 
protected Void onPostExecute(Void params){ 
    adapter.notifyDatasetChanged(); 
} 
+0

ok PLZ может дать мне пример или ссылку? – Android

+0

взгляните на мое редактирование – tyczj