0

Html.fromHtmlHTML テキストを画像付きで変換して ListView 内に設定しようとしていますが、画像が正方形として表示されます。imageGetter を実装し、設定しました

StrictMode.ThreadPolicy ポリシー = 新しい StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(ポリシー);

避けるためにandroid.os.NetworkOnMainThreadException

これが私のコードです:

private class MyTask extends AsyncTask<Void, Void, Void>{

@Override
protected Void doInBackground(Void... arg0) {
try {
URL rssUrl = new URL(link);
SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
                SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
                XMLReader myXMLReader = mySAXParser.getXMLReader();
                RSSHandler myRSSHandler = new RSSHandler();
                myXMLReader.setContentHandler(myRSSHandler);
                InputSource myInputSource = new InputSource(rssUrl.openStream());
myXMLReader.parse(myInputSource);

myRssFeed = myRSSHandler.getFeed(); 
            } catch (MalformedURLException e) {
                e.printStackTrace();    
            } catch (ParserConfigurationException e) {
                e.printStackTrace();    
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();    
            }

            return null;
        }

@Override
protected void onPostExecute(Void result) {
            if (myRssFeed!=null)
            {

                List<Map<String, String>> data = new ArrayList<Map<String, String>>();
                for (RSSItem item : myRssFeed.getList()) {
                    Spanned span = Html.fromHtml(item.getDescription().toString(), getImageHTML(), null);           
                    Map<String, String> datum = new HashMap<String, String>(0);
                    datum.put("title", item.getTitle());
                    datum.put("desc", span.toString());
                    data.add(datum);

                }
                SimpleAdapter adapter2 = new SimpleAdapter(getApplicationContext(), data, R.layout.listview, new String[] {"title", "desc"}, new int[] {R.id.text1,
                    R.id.text2});


                setListAdapter(adapter2);

ImageGetter は次のとおりです。

public ImageGetter getImageHTML(){
        ImageGetter ig = new ImageGetter(){
            public Drawable getDrawable(String source) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);
             try{
              Drawable d = Drawable.createFromStream(new URL(source).openStream(), "src name");
              d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());
              return d;
             }catch(IOException e){
              Log.v("IOException",e.getMessage());
              return null;
             }
            }
           };
       return ig;
   }

誰かが私を助けることができますか?

4

1 に答える 1

0

myRssFeed.getList() または item.getDescription() がネットワーク操作を実行するかどうかはわかりません (推測のみ)。doInBackground メソッド内に for ループ ロジックを追加してみてください。

 List<Map<String, String>> data = new ArrayList<Map<String, String>>();
            for (RSSItem item : myRssFeed.getList()) {
                Spanned span = Html.fromHtml(item.getDescription().toString(), getImageHTML(), null);           
                Map<String, String> datum = new HashMap<String, String>(0);
                datum.put("title", item.getTitle());
                datum.put("desc", span.toString());
                data.add(datum);

            }
            adapter2 = new SimpleAdapter(getApplicationContext(), data, R.layout.listview, new String[] {"title", "desc"}, new int[] {R.id.text1,
                R.id.text2});

MyTask で SimpleAdapter adapter2 をグローバル変数として宣言し、上記のコード スニペットを doInBackground メソッドに移動します。

于 2013-03-11T03:53:27.497 に答える