基本信息
源码名称:Android中通过ViewPager动态加载数据完整示例源码下载
源码大小:18.64M
文件格式:.zip
开发语言:Java
更新时间:2014-04-05
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
package com.pay.hzdaily.ui.adapter;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import org.json.JSONObject;
import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.androidquery.callback.BitmapAjaxCallback;
import com.pay.hzdaily.R;
import com.pay.hzdaily.context.Commen;
import com.pay.hzdaily.context.Constants;
import com.pay.hzdaily.model.db.provider.CategoryProvider;
import com.pay.hzdaily.model.db.provider.NewsProvider;
import com.pay.hzdaily.model.entity.base.Category;
import com.pay.hzdaily.model.entity.base.Image;
import com.pay.hzdaily.model.entity.base.News;
import com.pay.hzdaily.model.http.DownloadProgressListener;
import com.pay.hzdaily.model.http.FileDownloader;
import com.pay.hzdaily.model.http.HttpApi;
import com.pay.hzdaily.ui.NewsDetailsContentFragment;
import com.pay.hzdaily.utils.BitmapDecoder;
import com.pay.hzdaily.utils.Logs;
import com.pay.hzdaily.utils.SDCardFileUtils;
import com.pay.hzdaily.utils.Utility;
import android.R.integer;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager.LayoutParams;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebSettings.TextSize;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ViewPagerAdapter extends PagerAdapter implements
OnItemSelectedListener,OnItemClickListener{
/** 上下文 **/
private Context context;
/** ID列表 **/
private ArrayList<String> idlList;
/** 布局加载器 **/
private LayoutInflater mInflater;
/** views 两端为一个空白view增加反弹效果 **/
final ArrayList<View> views = new ArrayList<View>();
/** 分享的图片地址 **/
private String[] shareImg;
/** 分享的新闻文字内容 **/
private String[] shareStr;
/** 字体大小设置 **/
private float textSize;
/** aq **/
private AQuery aq;
/** 类别 **/
private String categoryId;
private CategoryProvider categoryProvider;
/** gallery 适配器 **/
private NewDetailsGalllery galleryAdapter;
/** point **/
private LinearLayout mLayout;
/** 图片的导航点点 **/
private Drawable point;
/** 每条新闻的图片数 **/
private int[] eachItemPicNum;
/** 每条新闻是否加载 **/
private int[] positionValue;
/** 字体大小设置 **/
private WebView textSizeView;
/** news id **/
private String countryNameStr;
/** 列表名称 **/
private String posiName;
/** 区县新闻的区域名称列表 **/
private ArrayList<String> listName;
/** viewpager 索引 **/
public int itemPosttion;
/** 新闻的加载状态 **/
public static final int NO_LOADED = 0;
public static final int LOADING = 1;
public static final int LOADED = 2;
/** 存储图片信息 **/
private HashMap<String, List<Image>> map;
private WebSettings settings;
private int ToastState=0;
/** 存放图片文件的文件夹地址 **/
private String dowloadDir = Environment.getExternalStorageDirectory()
"/hzdaily/newsdetailpic/";
private WeakHashMap<Integer, Bitmap> mCacheBitmapMap = new
WeakHashMap<Integer, Bitmap>();
private NewsProvider newsProvider = null;
private boolean isFromCloud = false;
public ViewPagerAdapter(Context context,float size,AQuery aq,
String categoryId){
mInflater = LayoutInflater.from(context);
this.context = context;
textSize = size;
this.aq = new AQuery(this.context);
this.categoryId = categoryId;
dowloadDir = dowloadDir categoryId "/";
if (Logs.IS_DEBUG) {
Logs.v("guo", "......cataid..../." categoryId);
}
judeEnvironment();
categoryProvider = new CategoryProvider(context);
map = new HashMap<String, List<Image>>();
newsProvider = new NewsProvider(context);
}
/**
* 文件路径判定
*/
private void judeEnvironment() {
// TODO Auto-generated method stub
//判定SD卡是否插入
if (SDCardFileUtils.avaiableSDCard()) {
File file = new File(dowloadDir);
//如果目录不存在 则创建下载目录
if (!file.exists()) {
file.mkdirs();
}
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return views.size();
}
@Override
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub
((ViewPager)container).removeView(views.get(position));
}
/**
* 跳转到每个页面都要执行的方法
*/
@Override
public void setPrimaryItem(View container, int position, Object object) {
// TODO Auto-generated method stub
setPosition(position);
//保证每条新闻都只请求一次联网
if (positionValue[position] == NO_LOADED) {
positionValue[position] = LOADING;
Logs.v("guo","idlList.get(position)==" idlList.get(position-1));
List<News> list = newsProvider.getById(categoryId, idlList.get(position-1));
if(list != null && list.size()>0) {
News news = list.get(0);
Logs.v("guo", "获取数据库" news.toString());
setNewsInfo(news);
}else {
if (Logs.IS_DEBUG) {
Logs.v("guo", "联网请求............." itemPosttion);
}
LinearLayout layout = (LinearLayout) views.get(itemPosttion).findViewById(R.id.progressBar1);
layout.setVisibility(View.VISIBLE);
getNewsData(categoryId, position-1,false);
}
}
//控制弹出toast次数,保证每次页面都只弹出一次
if (position != 0 && position != positionValue.length-1) {
ToastState =0;
}
if (position == 1) {
NewsDetailsContentFragment.setLastBtn(true);
}else {
NewsDetailsContentFragment.setLastBtn(false);
}
if (position == idlList.size()) {
NewsDetailsContentFragment.setNextBtn(true);
}else {
NewsDetailsContentFragment.setNextBtn(false);
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
((ViewPager)container).addView(views.get(position));
return views.get(position);
}
@Override
public void startUpdate(ViewGroup container) {
// TODO Auto-generated method stub
super.startUpdate(container);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
showDialogGallery(position);
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
// arg1.getParent().requestDisallowInterceptTouchEvent(true);
NewDetailsGalllery.releaseBitmap(position, position);
addNavigation(position);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
/**
* 设置新闻的条数,在NewsDetailsContentFragment设置adpater后调用
* @param list
* @param listName
* @param posiName
* @param isFromCloud
*/
public void setNewsId(ArrayList<String> list, String posiName, ArrayList<String> listName, boolean isFromCloud) {
idlList = list;
this.posiName = posiName;
this.listName = listName;
this.isFromCloud = isFromCloud;
positionValue = new int[idlList.size() 2];
eachItemPicNum = new int[idlList.size() 2];
for (int i = 0; i < positionValue.length; i ) {
positionValue[i] = NO_LOADED;
eachItemPicNum[i] = 0;
if (i == 0) {
positionValue[i] = LOADED;
eachItemPicNum[i] = 0;
}
if (i == positionValue.length -1) {
positionValue[i] = LOADED;
eachItemPicNum[i] = 0;
}
}
for (int i = 0; i < idlList.size() 2; i ) {
if (i == 0) {
View view = new View(context);
views.add(view);
}else {
if (i == idlList.size() 1) {
View view = new View(context);
views.add(view);
}else {
views.add(setView());
}
}
}
shareStr = new String[views.size()];
shareImg = new String[views.size()];
notifyDataSetChanged();
}
/**
* 设置每个页面的索引
* @param init
*/
public void setPosition(int init) {
NewsDetailsContentFragment.itemPosition = init;
itemPosttion = init;
}
/**
* 获取每个页面的索引
* @return
*/
public int getPosition() {
return itemPosttion;
}
/**
* 判断是否为区县新闻
* @return boolean
*/
private boolean isCountryNews() {
if (isFromCloud) {
return false;
}else {
//区县id的判空处理
if (posiName.equals("区县新闻") ||posiName.equals("服务资讯")) {
return true;
}else {
return false;
}
}
}
/**
* 判断当前页面的新闻是否加载完毕,加载完毕后方可分享
* @return
*/
public boolean getPositionIsLoaded() {
if (positionValue[itemPosttion] == LOADED) {
return true;
}else {
return false;
}
}
/**
* 获取新闻数据
* @param b 是否是刷新数据
*/
private void getNewsData(final String categoryid,final int index, final boolean b) {
// TODO Auto-generated method stub
aq.ajax(HttpApi.getNewsDetail(
categoryid,idlList.get(index)), JSONObject.class,
new AjaxCallback<JSONObject>(){
@Override
public void callback(String url, JSONObject json,
AjaxStatus status) {
// TODO Auto-generated method stub
LinearLayout layout = (LinearLayout) views.get(itemPosttion).findViewById(R.id.progressBar1);
layout.setVisibility(View.GONE);
if (null != json && null != json.optJSONObject("news")) {
if (Logs.IS_DEBUG) {
Logs.v("guo", "......................"
"...数据获取成功.." idlList.get(index) json.toString());
Logs.v("guo", "系统版本=" String.valueOf(Commen.getSystemVersion()));
Logs.v("guo", "id=" idlList.get(index));
}
Category vCategory = new Category();
vCategory.setId(categoryid);
News news = new News().createFromApi(
json.optJSONObject("news"));
news.setCategory(vCategory);
newsProvider.store(news);
newsProvider.close();
setNewsInfo(news);
((TextView)views.get(itemPosttion).findViewById(R.id.text_warning)).
setVisibility(View.GONE);
}else {
if (b) {
}else {
//如果没有获取到数据就提示加载失败
((TextView)views.get(itemPosttion).findViewById(R.id.text_warning)).
setVisibility(View.VISIBLE);
WebView webView =((WebView)views.get(itemPosttion).findViewById(R.id.
text_news_datails_content));
webView.setBackgroundColor(Color.parseColor("#ebebeb"));
}
}
}
});
}
/**
* 设置文章的内容
* @param news
*/
private void setNewsInfo(News news) {
// TODO Auto-generated method stub
// set title
if (news.getTitle() != null) {
((TextView)views.get(itemPosttion).findViewById(R.id.
text_news_detail_title)).setText((Html.fromHtml(news.getTitle().trim())));
}
//set author
// if (!isEmpty(news.getAuthor()) || !news.getAuthor().equals("null")) {
// ((TextView)views.get(itemPosttion).findViewById(R.id.
// text_news_detail_author)).setText("本报讯");
// }else {
// ((TextView)views.get(itemPosttion).findViewById(R.id.
// text_news_detail_author)).setText("本报讯");
// }
// set data
if (news.getPublishDate() != null) {
String publishDate = Utility.setDataFormat(news.getPublishDate());
((TextView)views.get(itemPosttion).findViewById(R.id.
text_news_detail_data)).setText(publishDate);
}
//区县新闻的城市名字
Button countryName = ((Button)views.get(itemPosttion).findViewById(
R.id.text_news_detail_country));
if (isCountryNews()) {
countryName.setVisibility(View.VISIBLE);
if (listName != null) {
String str = listName.get(itemPosttion-1);
countryName.setText(str);
}
}else {
countryName.setVisibility(View.GONE);
}
//set content
if (news.getContent() != null) {
WebView webView =((WebView)views.get(itemPosttion).findViewById(R.id.
text_news_datails_content));
webView.getSettings().setDefaultTextEncodingName("UTF-8");
settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
webView.clearCache(true);
settings.setSupportZoom(true);
settings.setTextSize(getLocalTextSize(textSize));
webView.setBackgroundColor(Color.parseColor("#ebebeb"));
webView.loadDataWithBaseURL(null, Utility.ToDBC(news.getContent()),
"text/html", "UTF-8", null);
}
//set gallery
if (news.getImages() != null) {
Gallery gallery;
gallery = (Gallery)views.get(itemPosttion).findViewById(
R.id.gallery);
galleryAdapter = new NewDetailsGalllery(context,aq,news.getImages(),categoryId, mCacheBitmapMap,false);
gallery.setAdapter(galleryAdapter);
map.put(String.valueOf(itemPosttion), news.getImages());
eachItemPicNum[itemPosttion] = news.getImages().size();
shareImg[itemPosttion] = Constants.host news.getImages().get(0).getImgUrl();
gallery.setOnItemSelectedListener(ViewPagerAdapter.this);
gallery.setOnItemClickListener(ViewPagerAdapter.this);
gallery.setVisibility(View.VISIBLE);
}else {
shareImg[itemPosttion] = "nopic";
}
notifyDataSetChanged();
//set share data
if (news.getContent()!= null) {
if ( news.getContent().length()<120) {
shareStr[itemPosttion] = news.getTitle() news.getContent().
substring(0, news.getContent().length()) ".....";
}else {
shareStr[itemPosttion] = news.getTitle() news.getContent().substring(0, 120) ".....";
}
}
positionValue[itemPosttion] = LOADED;
}
/**
* 获得每个新闻的view,后面再加载数据进去
* @param news
* @return
*/
private View setView() {
// TODO Auto-generated method stub
final ViewPagerHolder holder = new ViewPagerHolder();
View view = mInflater.inflate(R.layout.
news_datails_viewpager_item, null);
holder.mTitle = (TextView)view.findViewById(
R.id.text_news_detail_title);
holder.mAuthor = (TextView)view.findViewById(
R.id.text_news_detail_author);
holder.mData = (TextView)view.findViewById(R.id.
text_news_detail_data);
holder.mWarning = (TextView)view.findViewById(R.id.
text_warning);
holder.mGallery = (Gallery)view.findViewById(R.id.gallery);
// holder.mGallery.getParent().requestDisallowInterceptTouchEvent(true);
holder.mGallery.setVisibility(View.GONE);
// //viewpager 和 galler 焦点问题解决
//添加导航点点
holder.mpintLayout = (LinearLayout)view.findViewById(R.id.layout_point);
holder.mpintLayout.setVisibility(View.GONE);
point = context.getResources().getDrawable(R.drawable.icon_unselect);
holder.mContent = (WebView)view.findViewById(R.id.
text_news_datails_content);
holder.mContent.setBackgroundColor(Color.parseColor("#ebebeb"));
return view;
}
/**
* show a Gallery as Dialog Way
*/
private void showDialogGallery(final int position) {
// TODO Auto-generated method stub
// Layout Loader
final LayoutInflater inflater = (LayoutInflater)context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//DialogView
final View mView = inflater.inflate(
R.layout.news_details_gallery_asdialog, null);
Dialog mDialog = new Dialog(context, R.style.gallery_dialog);
mDialog.getWindow().getAttributes().flags =
android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
mDialog.getWindow().getAttributes().dimAmount= 0.7f;
mDialog.getWindow().getAttributes().alpha = 1.0f;
final LayoutParams dialogLayoutParams = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mDialog.setContentView(mView, dialogLayoutParams);
mDialog.setCanceledOnTouchOutside(true);
Gallery gallery = (Gallery)mView.findViewById(
R.id.gallery_asdialog);
final NewDetailsGalllery mAdapter = new NewDetailsGalllery(context, aq,
map.get(String.valueOf(itemPosttion)),categoryId,mCacheBitmapMap,true);
gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
NewDetailsGalllery.releaseBitmap(arg2,position);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
gallery.setAdapter(mAdapter);
gallery.setSelection(position);
mDialog.show();
}
/**
* 每页新闻所显示的内容
* @author freddy.guo
*
*/
public class ViewPagerHolder{
private TextView mWarning;
private TextView mTitle;
private TextView mAuthor;
private TextView mData;
private WebView mContent;
private Gallery mGallery;
private LinearLayout mpintLayout;
}
/**
* 设置新闻的字体大小
* @param size
*/
public void setTextSize(float size) {
if (Logs.IS_DEBUG) {
Logs.v("freddy", "字体大小设置");
}
if (null == views) {
return;
}
for (int i = 1; i < views.size()-1; i ) {
textSizeView = (WebView)views.get(i).findViewById(R.id.
text_news_datails_content);
textSize = size;
settings = textSizeView.getSettings();
settings.setTextSize(getLocalTextSize(size));
}
notifyDataSetChanged();
}
/**
* 获取字体大小的分类
* @return
*/
private TextSize getLocalTextSize(float textSize) {
if ((int)textSize <=12) {
return WebSettings.TextSize.SMALLEST;
}
if ((int)textSize == 14) {
return WebSettings.TextSize.SMALLER;
}
if ((int)textSize ==16) {
return WebSettings.TextSize.NORMAL;
}
if ((int)textSize ==18) {
return WebSettings.TextSize.LARGER;
}
if ((int)textSize==20) {
return WebSettings.TextSize.LARGEST;
}
return WebSettings.TextSize.NORMAL;
}
/**
* 判定字符串是否为空
* @param value
* @return
*/
private boolean isEmpty(String value) {
int strLen;
if (value == null || (strLen = value.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i ) {
if ((Character.isWhitespace(value.charAt(i)) == false)) {
return false;
}
}
return true;
}
/**
* add gallery navigation
*/
private void addNavigation(int position) {
mLayout = (LinearLayout)views.get(itemPosttion).findViewById(R.id.layout_point);
mLayout.setVisibility(View.VISIBLE);
mLayout.removeAllViews();
for (int i = 0; i <eachItemPicNum[itemPosttion]; i ) {
ImageView im = new ImageView(context);
if (i == position) {
im.setImageDrawable(context.getResources().
getDrawable(R.drawable.icon_selected));
} else {
im.setImageDrawable(point);
}
im.setPadding(5, 2, 0, 0);
mLayout.removeView(im);
mLayout.addView(im);
}
if (eachItemPicNum[itemPosttion] == 1) {
mLayout.setVisibility(View.GONE);
}
}
/**
* 获取分享的字段数据
* @return
*/
public String getShareDate() {
return Html.fromHtml(shareStr[itemPosttion]).toString();
}
/**
* 获取分享的图片URL
* @return
*/
public String getSharePicUrl() {
return shareImg[itemPosttion];
}
public void refreshDate() {
// TODO Auto-generated method stub
//显示提示
LinearLayout layout = (LinearLayout) views.get(itemPosttion).findViewById(R.id.progressBar1);
((TextView)views.get(itemPosttion).findViewById(R.id.text_warning)).
setVisibility(View.GONE);
layout.setVisibility(View.VISIBLE);
getNewsData(categoryId, itemPosttion-1,true);
}
}