【问题标题】:Parsing jsoup list解析jsoup列表
【发布时间】:2014-02-08 18:19:53
【问题描述】:

我创建了一个列表来解析网页。我可以显示第一篇文章的标题和第一张图片,但我想要的是显示每篇文章的图片。这是代码:

编辑代码

public class MainActivity extends Activity{
    ProgressDialog mProgressDialog;
    public static final String TAG_TITOLI = "titoli";
    private static final String TAG_IMMAGINE = "immagine";
    ListView lista;
    Bitmap bitmap;
    public ImageView immagine;
    public ImageView logoimg;

    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



        //View inflatedView = getLayoutInflater().inflate(R.layout.riga_listview, null);
        //immaginebtn = (Button)findViewById(R.id.immaginebtn);
        //creo ed eseguo l'asynctask
        ParsingPaginaWeb parsing = new ParsingPaginaWeb();
        parsing.execute("");

        // Immagine btn
        /*immaginebtn.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                // Execute Logo AsyncTask
                new Logo().execute();
            }
        });*/
        //new Logo().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();
                    immagine = ((ImageView) view.findViewById(R.id.imageView1));

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

                }
            });

    }

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

        ArrayList<String> titoli; //lista dei titoli
        ArrayList<Bitmap> bitmap = new ArrayList<Bitmap>(); 
        //ArrayList<String> content; //lista delle descrizioni

        @Override
        protected void onPreExecute()
        {   
            //prima di eseguire il parsing inizializzo gli arraylist
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setTitle("Multiplayer.it");
            mProgressDialog.setMessage("Caricamento articoli...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();

            titoli = new ArrayList<String>();
            bitmap = new ArrayList<Bitmap>(); 
            //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, bitmap);
            lista.setAdapter(adapter);
            mProgressDialog.dismiss();
            new Logo().execute();
        }


    }

    // Classe per caricamento immagini..

    // Logo AsyncTask

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


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog = new ProgressDialog(MainActivity.this);
            mProgressDialog.setTitle("Immagini");
            mProgressDialog.setMessage("Loading images...");
            mProgressDialog.setIndeterminate(false);
            mProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {
                // Connect to the web site
                Document document = Jsoup.connect(BLOG_URL).get();
                // Using Elements to get the class data 
                //Elements img = document.select("div.news-col-0 img[src]");
                // Locate the src attribute
                for(Element img : document.select("div.news-col-0 img[src]")) {
                    String ImgSrc = img.attr("src");
                // Download image from URL
                InputStream input = new java.net.URL(ImgSrc).openStream();
                // Decode Bitmap
                bitmap = BitmapFactory.decodeStream(input);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Set downloaded image into ImageView
            logoimg = (ImageView) findViewById(R.id.imageView1);
            logoimg.setImageBitmap(bitmap);
            mProgressDialog.dismiss();

           // ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli);
           // lista.setAdapter(adapter);
        }
    }

}

我该如何解决?

编辑: 适配器类:

public class ParsingArrayAdapter extends ArrayAdapter<String>{

    //ID and resources references
    private final static int LAYOUT = R.layout.riga_listview;
    private final static int TITOLO = R.id.riga_listview_titolo;
    private final static int IMMAGINE = R.id.imageView1;

    ArrayList<Bitmap> bitmap ; 

    ArrayList<String> titoli; //lista dei titoli

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

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

    @Override
    public int getCount()
    {
        return titoli.size(); //List lenght 
    }

    @SuppressLint("NewApi")
    @Override
    public View getView(int pos,View view,ViewGroup parent)
    {
        CacheRiga cache; //cache
        if(view==null)
        {

            view = inflater.inflate(LAYOUT, parent,false); 
            cache = new CacheRiga(); //inizializzo la cache
            cache.titolo = (TextView) view.findViewById(TITOLO); //title

            cache.immagini = (ImageView) view.findViewById(IMMAGINE);//collego descrizione


            view.setTag(cache);
        }
        else
        {
            cache = (CacheRiga) view.getTag(); 
        }

        cache.titolo.setText(titoli.get(pos)); //I set up the title

        //cache.immagini.setImageBitmap(bitmap.get(pos));



        return view;
    }

    private class CacheRiga { // Cache class
        public TextView titolo; // Title cache
        public ImageView immagini; // Image cache
    }

}

【问题讨论】:

    标签: android android-listview html-parsing jsoup


    【解决方案1】:

    首先,您可能会考虑在编写程序时只使用英语。这尤其包括命名 cmets 和变量、类、函数等。您永远不知道最终是否有人必须阅读您的代码(例如,当您将其发布在 SO 上时)。其次,我不确定您指的是代码中的哪一部分;解析 HTML 有两种不同的方法。
    无论如何,我假设您指的是Logo 类中的doInBackground()。您基本上已经完全实现了您在 ParsingPaginaWeb 类中寻找的内容。您遍历每个找到的 &lt;img&gt; 并获取相应的图像:

    for(Element img : document.select("div.news-col-0 img[src]")) {
        String src = img.attr("src");
        InputStream is = new java.net.URL(src).openStream();
        Bitmap bitmap = BitmapFactory.decodeStream(is);
        /* save the bitmap or pass it somewhere else,
           otherwise, it will simply be overwritten */
    }
    

    您可能必须更改存储位图的数据类型,因为您要检索多个。例如,您可以使用List&lt;Bitmap&gt; 来存储它们。

    【讨论】:

    • 感谢您的回答并感谢您的建议。无论如何..现在我编辑了问题并输入了适配器代码。使用你的代码我有同样的问题,我只显示第一张图片。也许问题出在适配器上?你能看看吗?谢谢。
    • @End.Game 您必须在循环内处理每个网址。您实现它的方式,ImgSrc 将被一遍又一遍地覆盖,并且只会处理最后一个图像。看看我的编辑。
    • 但是你可以看到我有两个不同的循环。一个用于标题,一个用于位图,然后在onPostExecute 中执行徽标类new Logo().execute();。不知道会不会有问题。。
    • 我建议您只发布代码的相关部分,因为肯定有不相关的部分。这将使每个人都更容易阅读您的代码并理解您的思路。
    • 问题是我找不到可能是真正问题的部分..你有 google plus 吗?也许你可以通过视频群聊帮助我..如果你愿意
    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 2014-03-01
    • 2011-12-11
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多