【问题标题】:How parse image with jsoup如何使用 jsoup 解析图像
【发布时间】:2014-02-06 12:50:01
【问题描述】:

我找不到任何解决方案!我需要用jsoup解析一个html页面,我也需要解析图像,但我做不到!这是我的MainActivity

public class MainActivity extends Activity {
    public static final String TAG_TITOLI = "titoli";
    private static final String TAG_CONTENT = "content";
    ListView lista;
    static final String BLOG_URL = "http://www.multiplayer.it";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lista = (ListView)this.findViewById(R.id.main_lista);//recupero lista da id

        //creo ed eseguo l'asynctask
        ParsingPaginaWeb parsing = new ParsingPaginaWeb();
        parsing.execute("");



         // Launching new screen on Selecting Single ListItem
            lista.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    // getting values from selected ListItem
                    String titoli = ((TextView) view.findViewById(R.id.riga_listview_titolo)).getText().toString();
                    //String cont = ((TextView) view.findViewById(R.id.riga_descrizione)).getText().toString();
                    //String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

                    // Starting new intent
                    Intent in = new Intent(getApplicationContext(), SingleActivity.class);
                    in.putExtra(TAG_TITOLI, titoli);
                    //in.putExtra(TAG_CONTENT, cont);
                    //in.putExtra(TAG_PHONE_MOBILE, description);
                    startActivity(in);

                }
            });

    }

    private class ParsingPaginaWeb extends AsyncTask<String,String,String> {

        ArrayList<String> titoli; //lista dei titoli
        //ArrayList<String> content; //lista delle descrizioni

        @Override
        protected void onPreExecute()
        {   
            Toast.makeText(MainActivity.this ,"Caricamento lista titoli...", Toast.LENGTH_SHORT).show();
            //prima di eseguire il parsing inizializzo gli arraylist
            titoli = new ArrayList<String>();
            //content = new ArrayList<String>();
        }

        @Override
        protected String doInBackground(String... params) {
            try {

                Document doc = Jsoup.connect(BLOG_URL).get();
                Elements nodeBlogStats = doc.select("div.news-col-0 h3"); //per multiplayer.it Elements nodeBlogStats = doc.select("div.news-col-0 h3"); per ftv #comunePartINI > option
                for(Element sezione : nodeBlogStats)
                {
                    titoli.add(sezione.text());
                }
            } catch (Exception e) {
                // In caso di errore
                Log.e("ESEMPIO", "ERRORE NEL PARSING");
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result)
        {
            // dopo che ho eseguito il parsing mostro i dati nella listview
            // usando il custom array adpater ParsingArrayAdapter
            ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli);
            lista.setAdapter(adapter);
        }


    }

}

我可以在其中解析标题并将它们显示在 ListView.. 这是适配器:

public class ParsingArrayAdapter extends ArrayAdapter<String>{

    //riferimenti statici alle risorse e agli id
    private final static int LAYOUT = R.layout.riga_listview;
    private final static int TITOLO = R.id.riga_listview_titolo;
    //private final static int DESCRIZIONE = R.id.riga_listview_descrizione;

    ArrayList<String> titoli; //lista dei titoli

    Context c; //context
    LayoutInflater inflater; //layout inflater

    public ParsingArrayAdapter(Context context,ArrayList<String> titoli)
    {
        super(context,TITOLO);
        this.c = context;
        this.titoli = titoli;
        this.inflater = LayoutInflater.from(c);
    }

    @Override
    public int getCount()
    {
        return titoli.size(); //ritorno lunghezza lista ( = numero dei titoli)
    }

    //quando la lista richiede una view
    @Override
    public View getView(int pos,View view,ViewGroup parent)
    {
        CacheRiga cache; //cache
        if(view==null)//se è la prima volta che viene richiesta la view
        {
            // creo la view ma non l'attacco alla lista in quanto devo ancora modificare
            // i testi delle textview
            view = inflater.inflate(LAYOUT, parent,false); 
            cache = new CacheRiga(); //inizializzo la cache
            cache.titolo = (TextView) view.findViewById(TITOLO); //collego titolo
            //cache.descrizione = (TextView) view.findViewById(DESCRIZIONE);//collego descrizione
            view.setTag(cache);//collego view con cache
        }
        else
        {
            cache = (CacheRiga) view.getTag(); //altrimenti prendo la cache dalla view
        }

        cache.titolo.setText(titoli.get(pos)); //imposto il titolo

        return view;
    }

    private class CacheRiga { // classe per la cache delle righe
        public TextView titolo; // cache titolo
        //public TextView descrizione; // cache descrizione
    }

}

如何为每篇文章插入图片?我不能简单地解析图像的div,因为我显示了一串字符。有没有办法将它插入到列表视图中?谢谢。啊,如果需要,这是riga_listview.xml,我想我需要在其中插入ImageView 部分。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/riga_listview_titolo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-condensed"
        android:layout_margin="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

【问题讨论】:

  • 您会从 JSOUP 获取 url,然后下载图像并显示或使用 Universal Image Loader 库之类的东西。是的,您需要在 ListView 项目布局中添加一个 ImageView
  • 你能帮我做吗?因为我正在尝试大约 1 次但没有成功!这很令人沮丧。
  • 实际上,如果我写:Elements nodeBlogStats = doc.select("img[src~=(?i)\\.(jpe?g)]");titoli.add(sezione.attr("src")); 我可以显示图像的 url,但不能显示图像本身!如何将它们从 textview 显示到 imageview?我有什么要改变的?我怎么能同时显示这两个东西!标题和图片?

标签: android xml android-listview html-parsing jsoup


【解决方案1】:

把它分成几块——

  1. 从div标签中获取图片的url
  2. 在列表视图中显示该图像

现在对于“1”,可以使用jsoup解析图片的url

对于“2”,首先将图像视图添加到您的列表视图 xml 然后创建一个异步任务,将图像 url 和图像视图的引用传递给它,并在 onPostExecute 中设置它的值。您说网站动态设置图像,那么每次在列表视图适配器的获取视图方法上,您都必须解析网页。虽然这听起来非常低效和密集,但我认为没有其他方法。如果您能以某种方式知道图像何时会发生变化,那么您可以对该事件进行此处理。 无论如何,这是从 url 下载图像并将其设置为图像视图的 asynctask 的代码

public class ThumbnailDownloader extends AsyncTask<String, Integer, Bitmap>{

ImageView imview;
Context ctx;

public ThumbnailDownloader(Context c, ImageView imview){
    this.imview = imview;
    this.ctx = c;
}

@Override
protected Bitmap doInBackground(String... urls) {
        try{
            HttpURLConnection connection = (HttpURLConnection)new URL(getThumbUrl(urls[0])).openConnection();

            connection.connect();
            InputStream input= connection.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(input);
        return bitmap;

        }
        catch (Exception f) {
            // TODO Auto-generated catch block
            f.printStackTrace();
        }
    return null;
}

@Override
protected void onPostExecute(Bitmap result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    if(result != null && imview!=null){
        imview.setImageBitmap(result);
    }
}

public String getThumbUrl(String videoUrl){
    return "http://img.youtube.com/vi/"+videoUrl+"/default.jpg";
}
}

getThumbUrl 方法你必须根据你的需要修改。 上面指定的用于下载 youtube 视频缩略图。

【讨论】:

    【解决方案2】:

    【讨论】:

    • Nothing :( 所以你建议下载设备中的图像然后显示?
    • 我觉得你得照android hive
    • 嗯,是的,也许是一个解决方案。但“问题”是我无法知道所有图像的网址。该网站会动态加载文章,并且每次每篇文章都有一个新图像。在这篇文章中,您建议我,开发人员知道图像的绝对 url 路径。我真的找不到解决方案。你能帮我完成我的项目吗?
    • 如果你想要所有图片,那么check this
    猜你喜欢
    • 2011-11-19
    • 2016-01-08
    • 2017-12-29
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多