1

PHPを使用してデータをJSONとしてエンコードするプログラムを作成しました。私のプログラムは正常に動作しており、エラーや問題は発生していません。私は欲しいものを手に入れていますが、非常に小さな問題に直面しています。

ここでは、アイテムの画像を表示することはできませんがListView、アイテムの行の 1 つをクリックしてアイテムの詳細をすべて表示すると、選択したアイテムの画像が表示されます。で画像を取得する必要があることを意味しますがListView、それを示すことができないため、誰かがこの間違いを整理するのを手伝ってもらえますか?

public class AlbumsActivity extends ListActivity {
// Connection detector
ConnectionDetector cd;

// Alert dialog manager
AlertDialogManager alert = new AlertDialogManager();

// Progress Dialog
private ProgressDialog pDialog;

// Creating JSON Parser object
JSONParser jsonParser = new JSONParser();

ArrayList<HashMap<String, String>> albumsList;

// albums JSONArray
JSONArray albums = null;

String imagepath;

// albums JSON url
private static final String URL_ALBUMS = "MY URL";

// ALL JSON node names
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_DESCRIPTION = "description";
private static final String TAG_IMAGEPATH = "imagepath";
private static final String TAG_SONGS_COUNT = "songs_count";

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

    cd = new ConnectionDetector(getApplicationContext());

// Check for internet connection
if (!cd.isConnectingToInternet()) {
    // Internet Connection is not present
    alert.showAlertDialog(AlbumsActivity.this, "Internet Connection Error",
            "Please connect to working Internet connection", false);
    // stop executing code by return
    return;
}

    // Hashmap for ListView
    albumsList = new ArrayList<HashMap<String, String>>();

    // Loading Albums JSON in Background Thread
    new LoadAlbums().execute();

    // get listview
    ListView lv = getListView();

    /**
     * Listview item click listener
     * TrackListActivity will be lauched by passing album id
     * */
    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
            // on selecting a single album
            // TrackListActivity will be launched to show tracks inside the album
            Intent i = new Intent(getApplicationContext(), TrackListActivity.class);

            // send album id to tracklist activity to get list of songs under that album
            String album_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString();
            i.putExtra("album_id", album_id);               

            startActivity(i);
        }
    });     
}

/**
 * Background Async Task to Load all Albums by making http request
 * */
class LoadAlbums extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(AlbumsActivity.this);
        pDialog.setMessage("Listing Albums ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting Albums JSON
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        // getting JSON string from URL
        String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET",
                params);

        // Check your log cat for JSON reponse
        Log.d("Albums JSON: ", "> " + json);

        try {               
            albums = new JSONArray(json);

            if (albums != null) {
                // looping through All albums
                for (int i = 0; i < albums.length(); i++) {
                    JSONObject c = albums.getJSONObject(i);

                    // Storing each json item values in variable
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);
                    String description = c.getString(TAG_DESCRIPTION);
                    String imageurl = c.getString(TAG_IMAGEPATH);
                    String songs_count = c.getString(TAG_SONGS_COUNT);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);
                    map.put(TAG_DESCRIPTION, description);
                    map.put(TAG_IMAGEPATH,imageurl);
                    map.put(TAG_SONGS_COUNT, songs_count);

                    // adding HashList to ArrayList
                    albumsList.add(map);
                }
            }else{
                Log.d("Albums: ", "null");
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all albums
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        AlbumsActivity.this, albumsList,
                        R.layout.list_item_albums, new String[] 
                                {
                                TAG_ID, TAG_NAME, TAG_DESCRIPTION, TAG_IMAGEPATH, TAG_SONGS_COUNT 
                                }, 
                                new int[] 
                                {
                                R.id.album_id, R.id.album_name, R.id.album_description, R.id.list_image, R.id.songs_count 
                                }
                        );

                // updating listview
                setListAdapter(adapter);
            }
        });

    }

}
4

5 に答える 5

1

最初に画像をダウンロードしてから、リストビューで表示する必要があります。画像のURLを直接渡すことはできません。機能しません。

于 2012-12-15T05:30:04.047 に答える
1

現在のコードを次のように変更し、 onPostExecute メソッドから runOnUiThread() も削除します。

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

        cd = new ConnectionDetector(getApplicationContext());

    // Check for internet connection
    if (!cd.isConnectingToInternet()) {
        // Internet Connection is not present
        alert.showAlertDialog(AlbumsActivity.this, "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    }

        // Hashmap for ListView
        albumsList = new ArrayList<HashMap<String, String>>();

        // Loading Albums JSON in Background Thread
        new LoadAlbums().execute();




    }

    /**
     * Background Async Task to Load all Albums by making http request
     * */
    class LoadAlbums extends AsyncTask<String, String, 
ArrayList<HashMap<String, String>>> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AlbumsActivity.this);
            pDialog.setMessage("Listing Albums ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        /**
         * getting Albums JSON
         * */
        protected ArrayList<HashMap<String, String>> 
     doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();

            // getting JSON string from URL
            String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET",
                    params);

            // Check your log cat for JSON reponse
            Log.d("Albums JSON: ", "> " + json);

            try {               
                albums = new JSONArray(json);

                if (albums != null) {
                    // looping through All albums
                    for (int i = 0; i < albums.length(); i++) {
                        JSONObject c = albums.getJSONObject(i);

                        // Storing each json item values in variable
                        String id = c.getString(TAG_ID);
                        String name = c.getString(TAG_NAME);
                        String description = c.getString(TAG_DESCRIPTION);
                        String imageurl = c.getString(TAG_IMAGEPATH);
                        String songs_count = c.getString(TAG_SONGS_COUNT);

                        // creating new HashMap
                        HashMap<String, String> map = new 
                HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_ID, id);
                        map.put(TAG_NAME, name);
                        map.put(TAG_DESCRIPTION, description);
                        map.put(TAG_IMAGEPATH,imageurl);
                        map.put(TAG_SONGS_COUNT, songs_count);

                        // adding HashList to ArrayList
                        albumsList.add(map);
                    }
                }else{
                    Log.d("Albums: ", "null");
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return albumsList;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(ArrayList<HashMap<String, 
                             String>> file_url) {
            // dismiss the dialog after getting all albums
            pDialog.dismiss();

            // get listview
            ListView lv = getListView();
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            AlbumsActivity.this, file_url,
                            R.layout.list_item_albums, new String[] 
                                    {
                                    TAG_ID, TAG_NAME, TAG_DESCRIPTION,
TAG_IMAGEPATH, TAG_SONGS_COUNT 
                                    }, 
                                    new int[] 
                                    {
                                    R.id.album_id,
     R.id.album_name, R.id.album_description, R.id.list_image, R.id.songs_count 
                                    }
                            );

                    // updating listview
                    lv.setListAdapter(adapter);

        /**
         * Listview item click listener
         * TrackListActivity will be lauched by passing album id
         * */
        lv.setOnItemClickListener(new android.widget.
                      AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                    long arg3) {
                // on selecting a single album

                Intent i = new Intent(getApplicationContext(),
                       TrackListActivity.class);

                // send album id to tracklist activity to get list of songs 
              //under that album
                String album_id = ((TextView) view.
                    findViewById(R.id.album_id)).getText().toString();
                i.putExtra("album_id", album_id);               

                startActivity(i);
            }
        });  


        }

    }

注 : ImageView で直接 Web URL を指定した場合、これは機能しません。最初に Web から画像をダウンロードしてから ImageView src に設定する必要があるためです。

この投稿を参照してください Web サーバーから画像を取得する方法

AndroidでURLでImageViewをロードするには?

于 2012-12-15T05:37:47.063 に答える
1

あなたのアダプターでこれを試してみてください。

 String imageURL = "htp://domain/some-path/kdhfbdskf.jpg";

 Bitmap bmp = null;
    try {
        InputStream in = new java.net.URL(imageURL).openStream();
        bmp = BitmapFactory.decodeStream(in);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    if (bmp != null) {
        holder.UserImageView.setImageBitmap(bmp);
    } else {
        holder.UserImageView.setImageResource(R.drawable.ic_launcher);
     }        
于 2012-12-15T06:14:48.657 に答える
1

これは、リスト ビューを画像とテキストでカスタマイズすることを意味します。そのために(私の場合は何をしたか)、画像のURLとテキストを2つの配列で取得します。次に、コンテキストと両方の配列を渡して、リスト ビューのアダプターを設定します。

画像を設定するには、ライブラリをインポートする必要があります (画像 URL ヘルパーまたはユニバース画像ローダーのいずれか)。どちらも役に立ちますが、使いやすい画像 URL ヘルパー ライブラリをお勧めします。

于 2012-12-15T06:02:44.847 に答える
0

runOnUiThread()を実行後から削除します。UIコンポーネントをスレッドに実行しません。単に画像を設定します。

于 2012-12-15T05:32:32.143 に答える