MyBasketball 第二篇 抓取网页内容

 其实我整个应用都是仿造大神鸿洋_只是根据自己的需要修改了小地方


 第二次增加了很多文件具体项目结构变化如下:


比第一次增加了CommonException.java、NewsItemAdapter.java、NewsItem.javaCons.java、DataUtil.java、NewsItemBiz.java、     URLUtil.java

CommonException.java是一些异常的抛出:

package com.example.mybasketball.activity;

@SuppressWarnings("serial")
public class CommonException extends Exception {
	public CommonException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public CommonException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public CommonException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public CommonException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

}

NewsItemAdapter.java是NewsItem的适配器:

package com.example.mybasketball.adpater;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.mybasketball.R;
import com.example.mybasketball.bean.NewsItem;
import com.example.mybasketball.util.DataUtil;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;

public class NewsItemAdapter extends BaseAdapter  
{  
  
    private LayoutInflater mInflater;  
    private List<NewsItem> mDatas;  
      
    /** 
     * 使用了github开源的ImageLoad进行了数据加载 
     */  
    private ImageLoader imageLoader = ImageLoader.getInstance();  
    private DisplayImageOptions options;  
  
    public NewsItemAdapter(Context context, List<NewsItem> datas)  
    {  
        this.mDatas = datas;  
        mInflater = LayoutInflater.from(context);  
          
        imageLoader.init(ImageLoaderConfiguration.createDefault(context));  
        options = new DisplayImageOptions.Builder().showStubImage(R.drawable.images)  
                .showImageForEmptyUri(R.drawable.images).showImageOnFail(R.drawable.images).cacheInMemory()  
                .cacheOnDisc().displayer(new RoundedBitmapDisplayer(20)).displayer(new FadeInBitmapDisplayer(300))  
                .build();  
    }  
  
    public void addAll(List<NewsItem> mDatas)  
    {  
        this.mDatas.addAll(mDatas);  
    }  
  
    @Override  
    public int getCount()  
    {  
        return mDatas.size();  
    }  
  
    @Override  
    public Object getItem(int position)  
    {  
        return mDatas.get(position);  
    }  
  
    @Override  
    public long getItemId(int position)  
    {  
        return position;  
    }  
  
    @Override  
    public View getView(int position, View convertView, ViewGroup parent)  
    {  
        ViewHolder holder = null;  
        if (convertView == null)  
        {  
            convertView = mInflater.inflate(R.layout.news_item, null);  
            holder = new ViewHolder();  
  
            holder.mContent = (TextView) convertView.findViewById(R.id.id_content);  
            holder.mTitle = (TextView) convertView.findViewById(R.id.id_title);  
            holder.mDate = (TextView) convertView.findViewById(R.id.id_date);  
            holder.mImg = (ImageView) convertView.findViewById(R.id.id_newsImg);  
  
            convertView.setTag(holder);  
        } else  
        {  
            holder = (ViewHolder) convertView.getTag();  
        }  
        NewsItem newsItem = mDatas.get(position);  
        //holder.mTitle.setText(DataUtil.ToDBC(newsItem.getTitle())); 
        holder.mTitle.setText(newsItem.getTitle());
        holder.mContent.setText(newsItem.getContent());  
        holder.mDate.setText(newsItem.getDate());  
        if (newsItem.getImgLink() != null)  
        {  
            holder.mImg.setVisibility(View.VISIBLE);  
            imageLoader.displayImage(newsItem.getImgLink(), holder.mImg, options);  
        } else  
        {  
            holder.mImg.setVisibility(View.GONE);  
        }  
  
        return convertView;  
    }  
  
    private final class ViewHolder  
    {  
        TextView mTitle;  
        TextView mContent;  
        ImageView mImg;  
        TextView mDate;  
    }  
  
}  

NewsItem.java是listview的item:

package com.example.mybasketball.bean;

public class NewsItem {

	private int id;

	/**
	 * 标题
	 */
	private String title;
	/**
	 * 链接
	 */
	private String link;
	/**
	 * 发布日期
	 */
	private String date;
	/**
	 * 图片的链接
	 */
	private String imgLink;
	/**
	 * 内容
	 */
	private String content;

	/**
	 * 类型
	 * 
	 */
	private int newsType;

	public int getNewsType() {
		return newsType;
	}

	public void setNewsType(int newsType) {
		this.newsType = newsType;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getLink() {
		return link;
	}

	public void setLink(String link) {
		this.link = link;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getImgLink() {
		return imgLink;
	}

	public void setImgLink(String imgLink) {
		this.imgLink = imgLink;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	@Override
	public String toString() {
		return "NewsItem [id=" + id + ", title=" + title + ", link=" + link
				+ ", date=" + date + ", imgLink=" + imgLink + ", content="
				+ content + ", newsType=" + newsType + "]";
	}

}
Cons.java是定义的一些常量接口:

package com.example.mybasketball.constaint;

public interface cons {
	public static final int NEWS_TYPE_NBA = 1;
	public static final int NEWS_TYPE_CHINA = 2;
	public static final int NEWS_TYPE_SKILL = 3;
	public static final int NEWS_TYPE_DATA = 4;
	public static final int NEWS_TYPE_VIDEO = 5;
}
DataUtil.java是负责从连接网络获取数据的工具类:

package com.example.mybasketball.util;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.util.Log;

import com.example.mybasketball.activity.CommonException;

public class DataUtil {
	/** 
     * 返回该链接地址的html数据 
     *  
     * @param urlStr 
     * @return 
     * @throws CommonException 
     */  
    public static String doGet(String urlStr) throws CommonException  
    {  
        StringBuffer sb = new StringBuffer();  
        try  
        {  
            URL url = new URL(urlStr);  
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
            conn.setRequestMethod("GET");  
            conn.setConnectTimeout(5000);  
            conn.setDoInput(true);  
            conn.setDoOutput(true);   
  
            if (conn.getResponseCode() == 200)  
            {  
                InputStream is = conn.getInputStream();  
                int len = 0;  
                byte[] buf = new byte[1024];  
  
                while ((len = is.read(buf)) != -1) //=-1表示读完了 
                {  
                    sb.append(new String(buf, 0, len, "UTF-8"));  
                }  
  
                is.close();  
            } else  
            {  
                throw new CommonException("访问网络失败!");  
            }  
  
        } catch (Exception e)  
        {  
            throw new CommonException("访问网络失败!");  
        }  
        
        return sb.toString();  
    }  
}




NewsItemBiz.java是完成把网页的内容解析出来然后设置给newsItem,最后返回一个newsItem的集合newsItems:

package com.example.mybasketball.util;

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.util.Log;

import com.example.mybasketball.activity.CommonException;
import com.example.mybasketball.bean.NewsItem;

public class NewsItemBiz {
	public List<NewsItem> getNewsItems(int newsType, int currentPage)
			throws CommonException {
	
		String urlStr = URLUtil.generateUrl(newsType, currentPage);

		String htmlStr = DataUtil.doGet(urlStr);

		List<NewsItem> newsItems = new ArrayList<NewsItem>();
		NewsItem newsItem = null;

		Document doc = Jsoup.parse(htmlStr);
	
	
		Elements units = doc.select("div.news-list>ul>li");
		for (int i = 0; i <units.size(); i++) {
			newsItem = new NewsItem();
			newsItem.setNewsType(newsType);

			Element unit_ele = units.get(i);

			Element h4_ele = unit_ele.select("div.list-hd>h4").get(0);
			Element h4_a_ele = h4_ele.select("a").get(0);
			String title = h4_a_ele.text();
			String href = h4_a_ele.attr("href");
			Log.e("mao", title);
			newsItem.setLink(href);
			newsItem.setTitle(title);

			Element  time = unit_ele.select("a.time").get(0);
			String date = time.text();
			newsItem.setDate(date);

			Element dl_ele = unit_ele.select("span.J_share_title").get(0);// dl
			String content = dl_ele.text();
			newsItem.setContent(content);
			
//			try {// 可能没有图片
//			Element img_ele = dt_ele.child(0);
//			String imgLink = img_ele.child(0).attr("src");
//			newsItem.setImgLink(imgLink);
//		} catch (IndexOutOfBoundsException e) {
//
//		}

			newsItems.add(newsItem);
		}

		return newsItems;

	}
}


URLUtil.java是根据文章类型,和当前页码生成url:

package com.example.mybasketball.util;

import android.util.Log;

import com.example.mybasketball.constaint.cons;

public class URLUtil {
	public static final String NEWS_LIST_URL_NBA= "http://voice.hupu.com/nba/newslist";
	

	public static final String NEWS_LIST_URL_CHINA = "http://voice.hupu.com/cba/newslist";


	/**
	 * 根据文章类型,和当前页码生成url
	 * 
	 * @param newsType
	 * @param currentPage
	 * @return
	 */
	public static String generateUrl(int newsType, int currentPage) {
		currentPage = currentPage > 0 ? currentPage : 1;
		String urlStr = "";
		switch (newsType) {
		case cons.NEWS_TYPE_NBA:
			urlStr = NEWS_LIST_URL_NBA;
			break;
		case cons.NEWS_TYPE_CHINA:
			urlStr = NEWS_LIST_URL_CHINA;
			break;
		
		}

		//urlStr += "/" + currentPage;
		
		return urlStr;
		

	}
}
原来的代码有
//urlStr += "/" + currentPage;
这一行,导致我去别的网站组成的URL是错误的,去掉就好了

fragment的代码也相应改了:

package com.example.mybasketball.fragment;


import java.util.ArrayList;
import java.util.List;

import me.maxwin.view.IXListViewLoadMore;
import me.maxwin.view.IXListViewRefreshListener;
import me.maxwin.view.XListView;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.mybasketball.R;
import com.example.mybasketball.activity.CommonException;
import com.example.mybasketball.adpater.NewsItemAdapter;
import com.example.mybasketball.bean.NewsItem;
import com.example.mybasketball.constaint.cons;
import com.example.mybasketball.util.NewsItemBiz;

public class NbaFragment extends Fragment implements IXListViewRefreshListener, IXListViewLoadMore  {
	/** 
     * 默认的newType 
     */  
    private int newsType = cons.NEWS_TYPE_NBA;  
    /** 
     * 当前页面 
     */  
    private int currentPage = 1;  
    /** 
     * 处理新闻的业务类 
     */  
    private NewsItemBiz mNewsItemBiz;  
    /** 
     * 扩展的ListView 
     */  
    private XListView mXListView;  
    /** 
     * 数据适配器 
     */  
    private NewsItemAdapter mAdapter;  
      
    /** 
     * 数据 
     */  
    private List<NewsItem> mDatas = new ArrayList<NewsItem>();  
  
    /** 
     * 获得newType 
     * @param newsType 
     */  
    public  NbaFragment (int newsType)  
    {  
        this.newsType = newsType;  
        mNewsItemBiz = new NewsItemBiz();  
    }  
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.nba, null);
	}
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState);
		mAdapter = new NewsItemAdapter(getActivity(), mDatas);  
        /** 
         * 初始化 
         */  
        mXListView = (XListView) getView().findViewById(R.id.id_xlistView);  
        mXListView.setAdapter(mAdapter);  
        mXListView.setPullRefreshEnable(this);  
        mXListView.setPullLoadEnable(this);  
        //mXListView.NotRefreshAtBegin();  
        /** 
         * 进来时直接刷新 
         */  
        mXListView.startRefresh();  
	}
	
	/** 
     * 记载数据的异步任务 
     * @author 
     * 
     */  
    class LoadDatasTask extends AsyncTask<Void, Void, Void>  
    {  
  
        @Override  
        protected Void doInBackground(Void... params)  
        {  
            try  
            {  
                List<NewsItem> newsItems = mNewsItemBiz.getNewsItems(newsType, currentPage);  
                mDatas = newsItems;  
            } catch (CommonException e)  
            {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
  
            return null;  
        }  
  
        @Override  
        protected void onPostExecute(Void result)  
        {  
            mAdapter.addAll(mDatas);  
            mAdapter.notifyDataSetChanged();  
            mXListView.stopRefresh();  
        }  
  
    } 
	@Override
	public void onRefresh() {
		// TODO Auto-generated method stub
		new LoadDatasTask().execute();  
	}
	@Override
	public void onLoadMore() {
		// TODO Auto-generated method stub
		
	}
	
	  
}

fragment的布局改成了XListView实现下拉刷新的控件  :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
      android:background="#CCCCCC"
    android:layout_height="match_parent" >

      
    <me.maxwin.view.XListView  
        android:id="@+id/id_xlistView"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:cacheColorHint="#00000000"  
        
        android:fadingEdge="none" >  
    </me.maxwin.view.XListView> 

</RelativeLayout>

newsitem.xml是适配器的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingBottom="8dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp" >

    <TextView
        android:id="@+id/id_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:textColor="@color/black"
        android:textSize="18sp" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/id_newsImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dp"
            android:src="@drawable/images"
            android:visibility="visible" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:gravity="top" >

                <TextView
                    android:id="@+id/id_content"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:gravity="top"
                    android:maxLines="2"
                    
                    android:textColor="@color/nomalGray"
                    android:textSize="14sp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical" >

                <TextView
                    android:id="@+id/id_date"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="center_vertical|right"
                    android:paddingTop="8dp"
                    android:singleLine="true"
                   
                    android:textColor="@color/nomalGray"
                    android:textSize="12sp" />

                <TextView
                    android:id="@+id/id"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:gravity="right"
                    android:paddingTop="16dp"
                    android:text="1"
                    android:textColor="@color/nomalGray"
                    android:visibility="gone" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
    <!--
                 <TextView  
                android:id="@+id/availableNum"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:textColor="@color/nomalGray"  
                android:layout_alignParentBottom="true"  
                android:layout_alignParentRight="true"  
                android:background="@drawable/bg_mark_pressed"  
                android:text="可借:4"  
                android:textSize="13sp"  
                android:layout_marginLeft="2dp"  
                android:layout_marginRight="2dp"  
                android:layout_centerVertical="true"  
                 />
    -->

</LinearLayout>









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值