基本信息
源码名称:Android中通过ViewPager动态加载数据完整示例源码下载
源码大小:18.64M
文件格式:.zip
开发语言:Java
更新时间:2014-04-05
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 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); } }