0

現在、Youtube ビデオへのリンクを表示するリスト ビューを含む Android アプリを開発しています。アプリケーションは、JSON としてサーバーからデータを取得します。現在、このサブドメインからこれらのビデオのサムネイルを表示しようとしています - http://img.youtube.com/vi/.

しかし、画像はリスト ビューに表示されません。

プロジェクトのコードは次のとおりです。

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>
4

3 に答える 3

1

UniversalImageLoaderを使用する と、非常に簡単に使用できます-imageLoader.displayImage(imageUri, imageView);

于 2013-02-25T12:24:45.910 に答える
0

youtubeのJSONデータでは、動画情報全体が「エントリ」のJSON配列になります。ハッシュマップのすべてのエントリに同じタグ名を作成しています。すべてのエントリに同じタグを付けると、最後のエントリの画像が表示されます。TAG NAMEを「map.put(CA_IMG+i, ca_link + ".jpg");」に変更してください。このソリューションがお役に立てば幸いです。

于 2013-02-25T12:35:52.243 に答える
0

画像をダウンロードしてから ListView に表示するのは悪いプロセスです。100 個を超える画像があると、表示に時間がかかると考えてください。

そして今、私が提案する最適化は次のとおりです。ListView内の画像の遅延読み込みのためのロジックを実装します。

以下の例を参照してください。

  1. レイジーリスト by Fedor
  2. ユニバーサル イメージ ローダー
  3. NovodaによるImageLoader
于 2013-02-25T12:36:44.760 に答える