GridView Problems.

Put problem concerning Views, Layouts and other XML-Resources (like AndroidManifest) here.

GridView Problems.

Postby seabookf_91 » Tue Oct 13, 2009 4:00 pm

Hello all guys, please help on the following problems.

I need to use a Grid view to show lots of pics from the internet, and i will use AsyncTask to download the image, and it will not the UI thread. But the gridview seems didn't work well.

Here is the code snippet, please help:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. public class GridViewMultiThread extends Activity {
  3.  
  4.         Button button = null;
  5.  
  6.         GridView gridView = null;
  7.  
  8.         Context context = null;
  9.  
  10.         ImageAdapter imageAdapter;
  11.  
  12.         private View mSearchPanel;
  13.  
  14.         DownloadPhotosTask downloadPhotosTask;
  15.  
  16.  
  17.  
  18.         /** Called when the activity is first created. */
  19.  
  20.         @Override
  21.  
  22.         public void onCreate(Bundle savedInstanceState) {
  23.  
  24.                 super.onCreate(savedInstanceState);
  25.  
  26.                 setContentView(R.layout.main);
  27.  
  28.  
  29.  
  30.                 gridView = (GridView) findViewById(R.id.showPhotoGridView);
  31.  
  32.                
  33.  
  34.                 imageAdapter = new ImageAdapter(this);
  35.  
  36.                 gridView.setAdapter(imageAdapter);
  37.  
  38.                 downloadPhotosTask = (DownloadPhotosTask) new DownloadPhotosTask().execute();
  39.  
  40. //              button.setOnClickListener(new OnClickListener() {
  41.  
  42. //                      @Override
  43.  
  44. //                      public void onClick(View v) {
  45.  
  46. //                              button.setEnabled(false);
  47.  
  48. //                              downloadPhotosTask = (DownloadPhotosTask) new DownloadPhotosTask()
  49.  
  50. //                                              .execute();
  51.  
  52. //                      }
  53.  
  54. //              });
  55.  
  56.         }
  57.  
  58.  
  59.  
  60.         class DownloadPhotosTask extends AsyncTask<Void, Photo, Void> implements
  61.  
  62.                         PhotoDownloadListener {
  63.  
  64.  
  65.  
  66. //              @Override
  67.  
  68. //              protected void onPreExecute() {
  69.  
  70. //                      if (mSearchPanel == null) {
  71.  
  72. //                              mSearchPanel = ((ViewStub) findViewById(R.id.stub_search))
  73.  
  74. //                                              .inflate();
  75.  
  76. //
  77.  
  78. //                              ProgressBar progress = (ProgressBar) mSearchPanel
  79.  
  80. //                                              .findViewById(R.id.progress);
  81.  
  82. //                              progress.setIndeterminate(true);
  83.  
  84. //
  85.  
  86. //                              ((TextView) mSearchPanel.findViewById(R.id.label_loading))
  87.  
  88. //                                              .setText("loading");
  89.  
  90. //
  91.  
  92. //                              final View cancelButton = mSearchPanel
  93.  
  94. //                                              .findViewById(R.id.button_cancel);
  95.  
  96. //                              cancelButton.setOnClickListener(new View.OnClickListener() {
  97.  
  98. //                                      public void onClick(View v) {
  99.  
  100. //                                              onCancelSearch();
  101.  
  102. //                                      }
  103.  
  104. //                              });
  105.  
  106. //                      }
  107.  
  108. //              }
  109.  
  110.  
  111.  
  112. //              private void onCancelSearch() {
  113.  
  114. //                      if (downloadPhotosTask != null
  115.  
  116. //                                      && downloadPhotosTask.getStatus() == AsyncTask.Status.RUNNING) {
  117.  
  118. //                              downloadPhotosTask.cancel(true);
  119.  
  120. //                              downloadPhotosTask = null;
  121.  
  122. //                      }
  123.  
  124. //              }
  125.  
  126.  
  127.  
  128.                 @Override
  129.  
  130.                 protected Void doInBackground(Void... params) {
  131.  
  132.                         DownLoader.getInstance().downLoadImage(this);
  133.  
  134.                         return null;
  135.  
  136.                 }
  137.  
  138.  
  139.  
  140.                 @Override
  141.  
  142.                 public void onPhotoDownloadListener(Photo photo) {
  143.  
  144.                         if (photo != null && !isCancelled()) {
  145.  
  146.                                 publishProgress(photo);
  147.  
  148.                         }
  149.  
  150.                 }
  151.  
  152.  
  153.  
  154.                 @Override
  155.  
  156.                 public void onProgressUpdate(Photo... photos) {
  157.  
  158.                         for (Photo photo : photos) {
  159.  
  160.                                 imageAdapter.addPhoto(photo);
  161.  
  162.                                 gridView.invalidateViews();
  163.  
  164. //                              imageAdapter.registerDataSetObserver(observer)
  165.  
  166.                         }
  167.  
  168.                 }
  169.  
  170.  
  171.  
  172.         }
  173.  
  174.  
  175.  
  176. }
  177.  
  178.  
  179.  
  180. class ImageAdapter extends BaseAdapter {
  181.  
  182.  
  183.  
  184.         private Context mContext;
  185.  
  186.         private List<Photo> photos = new ArrayList<Photo>();
  187.  
  188.  
  189.  
  190.         public ImageAdapter(Context context) {
  191.  
  192.                 this.mContext = context;
  193.  
  194.         }
  195.  
  196.  
  197.  
  198.         public void addPhoto(Photo photo) {
  199.  
  200.                 photos.add(photo);
  201.  
  202.         }
  203.  
  204.  
  205.  
  206.         @Override
  207.  
  208.         public int getCount() {
  209.  
  210.                 return photos.size();
  211.  
  212.         }
  213.  
  214.  
  215.  
  216.         @Override
  217.  
  218.         public Object getItem(int position) {
  219.  
  220.                 return photos.get(position);
  221.  
  222.         }
  223.  
  224.  
  225.  
  226.         @Override
  227.  
  228.         public long getItemId(int position) {
  229.  
  230.                 return position;
  231.  
  232.         }
  233.  
  234.  
  235.  
  236.         @Override
  237.  
  238.         public View getView(int position, View convertView, ViewGroup parent) {
  239.  
  240.                 final ImageView imageView;
  241.  
  242.                 if (convertView == null) {
  243.  
  244.                         imageView = new ImageView(mContext);
  245.  
  246.                 } else {
  247.  
  248.                         imageView = (ImageView) convertView;
  249.  
  250.                 }
  251.  
  252.                 imageView.setImageBitmap(photos.get(position).getBm());
  253.  
  254.                 return imageView;
  255.  
  256.         }
  257.  
  258.  
  259.  
  260. }
  261.  
  262.  
  263.  
  264. class DownLoader {
  265.  
  266.         private static DownLoader downloader = new DownLoader();
  267.  
  268.         private static String[] myImageURL = null;
  269.  
  270.         private List<Photo> photos = new ArrayList<Photo>();
  271.  
  272.  
  273.  
  274.         public static DownLoader getInstance() {
  275.  
  276.                 initImageURL();
  277.  
  278.                 return downloader;
  279.  
  280.         }
  281.  
  282.  
  283.  
  284.         static void initImageURL() {
  285.  
  286.                 int no = 0;
  287.  
  288.                 myImageURL = new String[100];
  289.  
  290.                 for (int i = 0; i < myImageURL.length; i++) {
  291.  
  292.                         myImageURL[i] = "http://cp.a8.com/image/128X128GIF/8" + no + ".gif";
  293.  
  294.                         no++;
  295.  
  296.                         if (no % 10 == 0) {
  297.  
  298.                                 no = 0;
  299.  
  300.                         }
  301.  
  302.                 }
  303.  
  304.         }
  305.  
  306.  
  307.  
  308.         public List<Photo> downLoadImage(PhotoDownloadListener listener) {
  309.  
  310.                 List<String> urls = Arrays.asList(myImageURL);
  311.  
  312.                 List<Photo> photos = new ArrayList<Photo>();
  313.  
  314.                 URL aryURI = null;
  315.  
  316.                 URLConnection conn = null;
  317.  
  318.                 InputStream is = null;
  319.  
  320.                 Bitmap bm = null;
  321.  
  322.                 Photo photo = null;
  323.  
  324.                 for (String url : urls) {
  325.  
  326.                         // Log.e("URL:", url);
  327.  
  328.                         try {
  329.  
  330.                                 aryURI = new URL(url);
  331.  
  332.                                 conn = aryURI.openConnection();
  333.  
  334.                                 is = conn.getInputStream();
  335.  
  336.                                 bm = BitmapFactory.decodeStream(is);
  337.  
  338.                                 photo = new Photo(bm);
  339.  
  340.                                 listener.onPhotoDownloadListener(photo);
  341.  
  342.                                 photos.add(photo);
  343.  
  344.                         } catch (Exception e) {
  345.  
  346.                                 throw new RuntimeException(e);
  347.  
  348.                         } finally {
  349.  
  350.                                 try {
  351.  
  352.                                         if (is != null)
  353.  
  354.                                                 is.close();
  355.  
  356.                                 } catch (IOException e) {
  357.  
  358.                                         e.printStackTrace();
  359.  
  360.                                 }
  361.  
  362.                         }
  363.  
  364.                 }
  365.  
  366.                 return photos;
  367.  
  368.         }
  369.  
  370. }
  371.  
  372.  
  373.  
  374. class Photo {
  375.  
  376.         private Bitmap bm;
  377.  
  378.  
  379.  
  380.         public Photo(Bitmap bm) {
  381.  
  382.                 this.bm = bm;
  383.  
  384.         }
  385.  
  386.  
  387.  
  388.         public Bitmap getBm() {
  389.  
  390.                 return bm;
  391.  
  392.         }
  393.  
  394.  
  395.  
  396.         public void setBm(Bitmap bm) {
  397.  
  398.                 this.bm = bm;
  399.  
  400.         }
  401.  
  402.  
  403.  
  404.         interface PhotoDownloadListener {
  405.  
  406.                 public void onPhotoDownloadListener(Photo photo);
  407.  
  408.         }
  409.  
  410.  
  411.  
  412. }
  413.  
  414.  
Parsed in 0.051 seconds, using GeSHi 1.0.8.4
Keep doing the things.
seabookf_91
Freshman
Freshman
 
Posts: 5
Joined: Mon Oct 12, 2009 9:26 am

Top

Good news, i fixed the problem.

Postby seabookf_91 » Wed Oct 14, 2009 6:54 am

Actually I searched all the related posts on the Android Community, there are some similar problems. And I tried a couple of hours to fix the problem, at lease I think it was fixed, though I am not exactly sure it’s a good solution.

Like I assumed that the problem is happened on gridView.invalidateViews(); I simply changed this into imageAdapter.notifyDataSetChanged(). And it works.
Keep doing the things.
seabookf_91
Freshman
Freshman
 
Posts: 5
Joined: Mon Oct 12, 2009 9:26 am

Top

Return to View, Layout & Resource Problems

Who is online

Users browsing this forum: No registered users and 4 guests