0

Currently I am developing an Android app containing a list view which displays links for Youtube videos. The application gets its data from the server as JSON. Now I am trying to display thumbnails for these video from this subdomain - http://img.youtube.com/vi/.

But the images don't show up in the list view.

Here is the code for the project :

1 - canticlesActivity.java

package com.shadatv.shada;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class canticlesActivity extends ListActivity {

    TextView httpStuff;
    HttpClient client;
    JSONArray canticles;
    String picpath = "http://img.youtube.com/vi/";

    File sdcard = Environment.getExternalStorageDirectory();

    File shadaRoot = new File(sdcard.getAbsolutePath() + "/shada_Folder");

    private static final String CA_NAME = "ca_name";
    private static final String CA_LINK = "ca_link";
    private static final String CA_IMG = "ca_img";
    private static final String URL = "http://dt-works.com/ags/shadatv/canticles/android_data";

    ArrayList<HashMap<String, String>> canticlesList;



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

        httpStuff = (TextView) findViewById(R.id.textView1);
        client = new DefaultHttpClient();
        new Read().execute();
    }

    public JSONArray allCanticles() throws ClientProtocolException, IOException, JSONException {
        StringBuilder url = new StringBuilder(URL);

        HttpGet get = new HttpGet(url.toString());
        HttpResponse r = client.execute(get);
        int status = r.getStatusLine().getStatusCode();

        if (status == 200) {
            HttpEntity e = r.getEntity();
            String data = EntityUtils.toString(e);
            JSONArray canticles = new JSONArray(data);          
            return canticles;

        } else {
            Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT).show();
            return null;
        }
    }

    public void downloadImage(String fileURL) {
        try {
//          Toast.makeText(getBaseContext(), "baaad", Toast.LENGTH_SHORT).show();
            String finlpth = "";
            finlpth = picpath + fileURL + "/2.jpg";
            shadaRoot.mkdirs();

            URL u = new URL(finlpth);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            File DownloadedFile = new File(shadaRoot, fileURL + ".jpg");
            // if(!outfile.exists())
            FileOutputStream f = new FileOutputStream(DownloadedFile);

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }

            f.close();

        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }
    }

    public class Read extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... params) {

            canticlesList = new ArrayList<HashMap<String, String>>();
            try {
                canticles = allCanticles();
                for (int i = 0; i < canticles.length(); i++) {
                    JSONObject canticle = canticles.getJSONObject(i);
                    String ca_name = canticle.getString(CA_NAME);
                    String ca_link = canticle.getString(CA_LINK);                   

                    downloadImage(ca_link);

                    HashMap<String, String> map = new HashMap<String, String>();                                        
                    map.put(CA_NAME, ca_name);
                    map.put(CA_LINK, ca_link);
                    map.put(CA_IMG, ca_link + ".jpg");
                    canticlesList.add(map);                                                     
                }

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {

            ListAdapter adapter = new SimpleAdapter(canticlesActivity.this, 
                                                    canticlesList,R.layout.list_item, 
                                                    new String[] {CA_NAME, CA_LINK, CA_IMG},
                                                    new int[] {R.id.ca_name, R.id.ca_link, R.id.ca_img});
            setListAdapter(adapter);

        }       
    }
}

2 - list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_selector"
    android:orientation="horizontal" >

    <!-- Product id (pid) - will be HIDDEN - used to pass to other activity -->

    <ImageView
        android:id="@+id/ca_img"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:contentDescription="@string/desc"              
         />

    <TextView
        android:id="@+id/ca_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         />

    <!-- Name Label -->
    <TextView
        android:id="@+id/ca_link"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingTop="6dip"
        android:paddingLeft="6dip"
        android:textSize="17sp"
        android:textStyle="bold"
        android:visibility="gone" />

</LinearLayout>
Perception
  • 79,279
  • 19
  • 185
  • 195
eng.ahmed
  • 905
  • 4
  • 16
  • 38
  • This looks like a code dump to me. How about solving one problem at a time? Start with "what directory isn't being created?" Then maybe "the file isn't downloaded." – Dave Newton Feb 25 '13 at 12:25
  • I think the problem in downloadImage method. see my answer to download any image from url http://stackoverflow.com/questions/13486758/android-bitmap-from-url-always-null/13487664#13487664 – Kirit Vaghela Feb 25 '13 at 12:29
  • i think the main problem that the method itself doesn't run because i commented all code in it then put just Toast and it didn't work also – eng.ahmed Feb 25 '13 at 12:32

3 Answers3

1

You can use UniversalImageLoader it very simple for using -imageLoader.displayImage(imageUri, imageView);

Vetalll
  • 3,472
  • 6
  • 24
  • 34
0

In youtube JSON data ,The entire videos information will be in "entry" JSON array. You are creating same tag name for all the entires in the Hashmap.. If you give same tag for all entries then it will display last entry image. Please change the TAG NAME to "map.put(CA_IMG+i, ca_link + ".jpg");" I hope this solution will be helpful for you.

Surya
  • 21
  • 1
  • 3
0

Downloading images and then displaying in ListView is bad process. Because just think if you are having >100 images then it will take more time to display it.

And now optimization which i would suggest is: Implement logic for lazy loading of Images inside ListView.

Refer below examples:

  1. Lazy List by Fedor
  2. Universal Image Loader
  3. ImageLoader by Novoda
Community
  • 1
  • 1
Paresh Mayani
  • 127,700
  • 71
  • 241
  • 295