当前位置: 首页 > 知识库问答 >
问题:

如何使用毕加索或通用图像加载器和listview

梁丘缪文
2023-03-14

从internet加载文本数据并链接到图像。我无法理解如何在listview中加载图像。阅读后,它需要使用毕加索或通用图像加载器,但不明白如何使用。请更正我的代码

    public class JsonReadTask extends AsyncTask<String, Void, String> {

      @Override
      protected String doInBackground(String... params) {
       HttpClient httpclient = new DefaultHttpClient();
       HttpPost httppost = new HttpPost(params[0]);
       try {
        HttpResponse response = httpclient.execute(httppost);
        jsonResult = inputStreamToString(
          response.getEntity().getContent()).toString();
       }

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

      private StringBuilder inputStreamToString(InputStream is) {
       String rLine = "";
       StringBuilder answer = new StringBuilder();
       BufferedReader rd = new BufferedReader(new InputStreamReader(is));

       try {
        while ((rLine = rd.readLine()) != null) {
         answer.append(rLine);
        }
       }

       catch (IOException e) {
        // e.printStackTrace();
        Toast.makeText(getActivity(),
          "Error..." + e.toString(), Toast.LENGTH_LONG).show();
       }
       return answer;
      }

      @Override
      protected void onPostExecute(String result) {
       ListDrwaer();
      }
     }// end async task

     public void accessWebService() {
      JsonReadTask task = new JsonReadTask();
      // passes values for the urls string array
      task.execute(new String[] { url });
     }
     private final String ATTRIBUTE1 = "header"; 
     private final String ATTRIBUTE2 = "short_text";
     private final String ATTRIBUTE3 = "team";
     private final String ATTRIBUTE4 = "datatime";
     private final String ATTRIBUTE5 = "photo_url";
     Drawable drawable;
     // build hash set for list view
     public void ListDrwaer() {          
        // упаковываем данные в понятную для адаптера структуру
            ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
                    Map<String, Object> m;

            // массив имен атрибутов, из которых будут читаться данные
            String[] from = {ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5};

            // массив ID View-компонентов, в которые будут вставлять данные
            int[] to = { R.id.header, R.id.short_text,  R.id.team, R.id.datatime, R.id.img_news};

      try {
       JSONObject jsonResponse = new JSONObject(jsonResult);
       JSONArray jsonMainNode = jsonResponse.optJSONArray("news");
       for (int i = 0; i < jsonMainNode.length(); i++) {
        JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
        String header = jsonChildNode.optString("header");
        String short_text = jsonChildNode.optString("short_text");
        String team = jsonChildNode.optString("team");
        String datatime = jsonChildNode.optString("datatime");
        String photo_url = jsonChildNode.optString("photo_url");    


        // создаем новый Map
        m = new HashMap<String, Object>();
        m.put(ATTRIBUTE1, header);
        m.put(ATTRIBUTE2, short_text);
        m.put(ATTRIBUTE3, team);
        m.put(ATTRIBUTE4, datatime);
     //   m.put(ATTRIBUTE5, url_photo);
        // добавляем его в коллекцию
        data.add(m);
       }
      } catch (JSONException e) {
       Toast.makeText(getActivity(), "Error" + e.toString(),
         Toast.LENGTH_SHORT).show();
      }

      SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(), data,
        R.layout.news_details,
        from, to);        
      Parcelable state = listView.onSaveInstanceState();
      listView.setAdapter(simpleAdapter);
      listView.onRestoreInstanceState(state);
     }

}

共有2个答案

子车鸿运
2023-03-14

使用Picasso,您可以为ListView创建一个自定义适配器,并在getView()中的ImageView上调用.load(url)。对于您提到的另一个库,解决方案可能是相同的。

但是,在您的情况下,您似乎需要提前在AsycTask中获取图像的url。在这种情况下,您还需要一些逻辑来在创建适配器之前获取url,或者需要适配器中的一些奇特逻辑来加载url然后重新加载视图。

臧烨烁
2023-03-14

创建您自己的从ArrayAdapter扩展的适配器。有很多例子:

  • Vogella教程
  • 另一个

然后在getView方法调用中(类似的情况取决于您的实现):

Picasso.with(context).load(getItem(position).get(ATTRIBUTE5)).into(holder.imageView);

有关更多信息,请参阅毕加索留档。

 类似资料:
  • 正如你可以看到的使用链接,毕加索只有3个选项加载一个图像。我的问题是,如果您有一个从API的JSON响应解析的base64字符串,那么如何加载图像?

  • 我正试图使用GridView毕加索\通用图像加载器制作一个画廊,我遇到了一些问题。每次我只加载本地文件(从外部存储),而不是从web。我制作了两个视频,更好地描述了问题,然后是文字。 我使用自定义适配器扩展BaseAdapter。 是带有图像的数组 加载图像速度足够快,但滚动速度非常慢。这是youtube上的视频演示 滚动速度快,但加载速度慢。此外,当你快速滚动时,你可以看到错误的图像,这些图像将

  • 我正在使用毕加索图书馆。我知道,如果我将图片从URL加载到图像视图中,有一种回调方法。但我不想加载到imageview中。相反,我想将其另存为位图。所以我用了下面的代码 我怎样才能得到一个回调方法,知道我的图像是成功下载使用毕加索? 不要说位图对象的空检查。这会导致错误。

  • 4.使用自定义适配器在ListView中显示图像。 我只是对步骤1和2有问题。我可以从服务器获取新闻,并在我的ListView中显示它们 并通过在我的适配器中添加以下代码显示缓存中的图像:

  • 我有一个从服务器加载映像的项目。我这样用毕加索, 多谢了。

  • 我在应用程序中使用了毕加索,但我面临一个问题。我在Listview中显示用户配置文件图像,如果图像不存在,我想在ImageView中显示用户名的首字母缩写。我可以显示个人资料图像,如果存在,但为了显示首字母,我如何知道用户没有图像。?