Android 无法在listview中显示项目图像

Android 无法在listview中显示项目图像,android,android-layout,android-widget,android-listview,Android,Android Layout,Android Widget,Android Listview,我制作了一个程序,在其中我使用PHP将数据编码为JSON。我的程序运行良好,没有显示任何错误或问题;我得到了我想要的,但我面临着一个非常小的问题 在这里,我无法在ListView中显示项目的图像,但每当我单击其中一个项目行以查看完整的项目详细信息时,我都会得到所选项目的图像。这意味着我应该在ListView中获取图像,但我无法显示,所以请有人帮助解决这个错误吗 public class AlbumsActivity extends ListActivity { // Connection det

我制作了一个程序,在其中我使用PHP将数据编码为JSON。我的程序运行良好,没有显示任何错误或问题;我得到了我想要的,但我面临着一个非常小的问题

在这里,我无法在ListView中显示项目的图像,但每当我单击其中一个项目行以查看完整的项目详细信息时,我都会得到所选项目的图像。这意味着我应该在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);
            }
        });

    }

}

您必须首先下载图像,然后在列表视图中显示它。您不能直接传递图像URL,它将不起作用。

您必须先下载图像,然后在列表视图中显示它。您不能直接传递图像URL,它将不起作用。

从post Execute中删除runOnUiThread,并且您不会将UI组件运行到线程中。。只需设置图像…

将runOnUiThread从post Execute中移除,就不会将UI组件运行到线程中。。只需设置图像…

将当前代码更改为,并从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服务器获取图像


将当前代码更改为,并从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服务器获取图像


这意味着您要使用图像和文本自定义列表视图。对于我在本例中所做的,获取两个数组中的图像url和文本。然后通过传递上下文(两个数组)来设置列表视图的适配器


要设置图像,您需要导入图像url帮助器或Universe图像加载器库。两者都可以很好地帮助您,但我建议您使用图像url帮助器库,因为它很容易使用。

这意味着您希望使用图像和文本自定义列表视图。对于我在本例中所做的,获取两个数组中的图像url和文本。然后通过传递上下文(两个数组)来设置列表视图的适配器


要设置图像,您需要导入图像url帮助器或Universe图像加载器库。两者都可以很好地帮助您,但我建议您使用图像url帮助器库,因为它易于使用。

在适配器中尝试此方法,它可能会帮助您:

 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);
     }        

在适配器中尝试此操作,它可能会帮助您:

 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);
     }        


把你的doInbackground代码也发到@ρцσρѕρєK,它已经在那里了。你放了一个图片url。您应该先下载它,然后分配给listview中的imageview。注意,您不需要在onPostExecute中调用runOnUiThread。此方法已在UI线程上运行。@Sam我已在onPostExecute中删除了runOnUiThread,但现在我无法获得项目列表,即使发布您的doInbackground代码@ρ∑ρρK,它已经在那里了。您放置了一个图像url。您应该先下载它,然后分配给listview中的imageview。注意,您不需要在onPostExecute中调用runOnUiThread。此方法已在UI线程上运行。@Sam我已在onPostExecute中删除runOnUiThread,但现在即使我下载了图像,也无法获取项目列表,然后仅尝试显示该图像,因此我以项目详细形式获取了项目的图像,但我的运气不好,我缺少了一些东西,这就是为什么不能在listview中获取的原因,但我希望我能尽快得到它,因为我已经下载了图片,然后只想显示一个,因此我得到了项目详细形式的项目图片,但我的运气不好,我错过了一些东西,这就是为什么不能进入listview的原因,但我希望我能尽快得到它,感谢您编写代码,仍然存在相同的问题,无法在项目详细信息表单中查看选定项目的图像,但无法在ListView中查看。。help@Udhikriman:抱歉,亲爱的,您需要创建一个自定义适配器,然后将其设置为ImageView查看此帖子好的,我会这样做,我感谢你帮助我的努力,现在我要给你应得的。。。。thanks@Udhikriman如果你有任何问题,那么告诉我我会很快为你解决吗?@Udhikriman:我会在晚上9:00后看到你的问题,并在你的问题中给出答案,所以请把你的问题弄清楚,谢谢你写代码,仍然存在相同的问题,无法在项目详细信息表单中查看选定项目的图像,但无法在ListView中查看。。help@Udhikriman:抱歉,亲爱的,您需要创建一个自定义适配器,然后将其设置为ImageView查看此帖子好的,我会这样做,我感谢你帮助我的努力,现在我要给你应得的。。。。thanks@Udhikriman如果你有任何问题,那么告诉我我会很快为你做什么?@Udhikriman:我会在晚上9点后看到你的问题,并在你的问题中给出答案,所以请把你的问题弄清楚