其实我整个应用都是仿造大神鸿洋_只是根据自己的需要修改了小地方
第二次增加了很多文件具体项目结构变化如下:
比第一次增加了CommonException.java、NewsItemAdapter.java、NewsItem.java、Cons.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>