下拉刷新是很多应用都使用的很流行的一种效果,今天也算是彻底的理解了一下PullToRefreshListView的使用,但是弄了一天却在一个很傻的地方犯了错误。
@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.news_items, null); holder = new ViewHolder(); holder.newsImage = (ImageView) convertView.findViewById(R.id.news_image); holder.titleTextView = (TextView) convertView.findViewById(R.id.news_title); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } News news = newses.get(position); if (news != null) { holder.titleTextView.setText(newses.get(position).getTitle()); AVFile avFile = newses.get(position).getAVFile("image"); if (avFile == null) { Logger.d("该条新闻的图片没有"); } if (avFile != null) { String url = avFile.getUrl(); //显示图片的配置 DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnFail(R.drawable.healthy_icon01) .showImageForEmptyUri(R.drawable.healthy_icon01) .showImageOnLoading(R.drawable.healthy_icon01) .cacheInMemory(true) .cacheOnDisk(true) .displayer(new SimpleBitmapDisplayer()) .bitmapConfig(Bitmap.Config.RGB_565) .build(); ImageLoader.getInstance().displayImage(url, holder.newsImage, options); } } return convertView; } static class ViewHolder{ ImageView newsImage; TextView titleTextView; }
@Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView == null){ view = LayoutInflater.from(context).inflate(R.layout.healthy_item,null); }else { view = convertView; } TextView healthy_title = (TextView) view.findViewById(R.id.healthy_title); healthy_title.setText(healthyList.get(position).getTitle()); return view; }
我犯的错误是将TextView healthy_title = (TextView) view.findViewById(R.id.healthy_title);healthy_title.setText(healthyList.get(position).getTitle());这段代码写在了第一个if判断中,导致的结果就是如果covertView为空时,标题可以正常在页面上显示,一旦直接加入缓存时,标题就无法正常显示,就会出现很奇怪的错误,ListView中的标题各种错乱,其实应该在就可以想到是BaseAdapter中的错误的,还好我有足够的时间去纠正错误并从中学习到很多知识。
关于PullToRefreshListView的使用网上有很多的博客都有介绍。基本绑定adapter之后,可以通过setRefreshing(),直接显示刷新的页面。之后就是setOnRefreshListener()来监听滑动的判断,可以设置PullToRefresh的mode来设置上滑刷新、下滑刷新。
@Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { //上滑刷新 //Toast.makeText(HealthyActivity.this,"上拉刷新",Toast.LENGTH_SHORT).show(); String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // Update the LastUpdatedLabel refreshView.getLoadingLayoutProxy().setLastUpdatedLabel( "更新于" + " : " + label); asyncHttpClient.get(nextPageUrl,new AsyncHttpResponseHandler() { @Override public void onSuccess(int i, Header[] headers, byte[] bytes) { try { String str = new String(bytes,"gb2312"); Document document = Jsoup.parse(str); Element body = document.body(); Elements tdWidth = body.select("td[width=500]"); Elements tdHeight = tdWidth.select("td[height=40]"); Elements links = tdHeight.select("a"); Log.d("hys",healthyList.toString()); for (Element link : links){ String title = link.text(); String url = link.attr("href"); healthy = new Healthy(); healthy.setTitle(title); healthy.setUrl(url); healthyList.add(healthy); } // // // Iterator<Healthy> iterator = healthyList.iterator(); // while (iterator.hasNext()){ // Healthy healthy = iterator.next(); // Log.d("hys","healthy1.getTitle() : "+healthy.getTitle()); // } HealthyAdapter healthyAdapter = new HealthyAdapter(HealthyActivity.this,healthyList); healthyAdapter.notifyDataSetChanged(); pullToRefreshListView.onRefreshComplete(); Elements link_more = body.select("a[href^=http://health.enorth.com.cn/system/more/]"); if (link_more.size() == 2){ nextPageUrl = link_more.get(1).attr("href"); } else if (link_more.size() == 1){ nextPageUrl = link_more.get(0).attr("href"); } }catch (IOException e){ Log.d("file read exception : ", e.getMessage()); } } @Override public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { Toast.makeText(HealthyActivity.this, "请检查网络连接", Toast.LENGTH_SHORT).show(); Log.d("asyncHttpClient fail : ",throwable.getMessage()); } }); }
String label = DateUtils.formatDateTime(getApplicationContext(),System.currentTimeMillis(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(
"更新于" + " : " + label);
DateUtils是android.text.format包下的一个类,非常的好用,以后在时间方面可以多多使用这个方法。刷新结束必须healthyAdapter.notifyDataSetChanged();
pullToRefreshListView.onRefreshComplete();这两个方法,第一个用来提示数据加载完成,第二个表示刷新已经完成,刷新就会结束。另外在属性上可以对PullToRefreshListView进行属性上的定制,只要在xml文件中增加一个 xmlns:ptr="http://schemas.android.com/apk/res-auto" 的命名空间即可。
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="PullToRefresh"> <!-- A drawable to use as the background of the Refreshable View --> <!-- 设置刷新view的背景 --> <attr name="ptrRefreshableViewBackground" format="reference|color" /> <!-- A drawable to use as the background of the Header and Footer Loading Views --> <!-- 设置头部view的背景 --> <attr name="ptrHeaderBackground" format="reference|color" /> <!-- Text Color of the Header and Footer Loading Views --> <!-- 设置头部/底部文字的颜色 --> <attr name="ptrHeaderTextColor" format="reference|color" /> <!-- Text Color of the Header and Footer Loading Views Sub Header --> <!-- 设置头部/底部副标题的文字颜色 --> <attr name="ptrHeaderSubTextColor" format="reference|color" /> <!-- Mode of Pull-to-Refresh that should be used --> <!-- 设置下拉刷新的模式,有多重方式可选。无刷新功能,从顶部刷新,从底部刷新,二者都有,只允许手动刷新 --> <attr name="ptrMode"> <flag name="disabled" value="0x0" /> <flag name="pullFromStart" value="0x1" /> <flag name="pullFromEnd" value="0x2" /> <flag name="both" value="0x3" /> <flag name="manualOnly" value="0x4" /> <!-- These last two are depreacted --> <!-- 这两个属性不推荐了,用上面的代替即可 --> <flag name="pullDownFromTop" value="0x1" /> <flag name="pullUpFromBottom" value="0x2" /> </attr> <!-- Whether the Indicator overlay(s) should be used --> <!-- 是否显示指示箭头 --> <attr name="ptrShowIndicator" format="reference|boolean" /> <!-- Drawable to use as Loading Indicator. Changes both Header and Footer. --> <!-- 指示箭头的图片 --> <attr name="ptrDrawable" format="reference" /> <!-- Drawable to use as Loading Indicator in the Header View. Overrides value set in ptrDrawable. --> <!-- 顶部指示箭头的图片,设置后会覆盖ptrDrawable中顶部的设置 --> <attr name="ptrDrawableStart" format="reference" /> <!-- Drawable to use as Loading Indicator in the Fooer View. Overrides value set in ptrDrawable. --> <!-- 底部指示箭头的图片,设置后会覆盖ptrDrawable中底部的设置 --> <attr name="ptrDrawableEnd" format="reference" /> <!-- Whether Android's built-in Over Scroll should be utilised for Pull-to-Refresh. --> <attr name="ptrOverScroll" format="reference|boolean" /> <!-- Base text color, typeface, size, and style for Header and Footer Loading Views --> <!-- 设置文字的基本字体 --> <attr name="ptrHeaderTextAppearance" format="reference" /> <!-- Base text color, typeface, size, and style for Header and Footer Loading Views Sub Header --> <!-- 设置副标题的基本字体 --> <attr name="ptrSubHeaderTextAppearance" format="reference" /> <!-- Style of Animation should be used displayed when pulling. --> <!-- 设置下拉时标识图的动画,默认为rotate --> <attr name="ptrAnimationStyle"> <flag name="rotate" value="0x0" /> <flag name="flip" value="0x1" /> </attr> <!-- Whether the user can scroll while the View is Refreshing --> <!-- 设置刷新时是否允许滚动,一般为true --> <attr name="ptrScrollingWhileRefreshingEnabled" format="reference|boolean" /> <!-- Whether PullToRefreshListView has it's extras enabled. This allows the user to be able to scroll while refreshing, and behaves better. It acheives this by adding Header and/or Footer Views to the ListView. --> <!-- 允许在listview中添加头/尾视图 --> <attr name="ptrListViewExtrasEnabled" format="reference|boolean" /> <!-- Whether the Drawable should be continually rotated as you pull. This only takes effect when using the 'Rotate' Animation Style. --> <!-- 当设置rotate时,可以用这个来设置刷新时旋转的图片 --> <attr name="ptrRotateDrawableWhilePulling" format="reference|boolean" /> <!-- BELOW HERE ARE DEPRECEATED. DO NOT USE. --> <attr name="ptrAdapterViewBackground" format="reference|color" /> <attr name="ptrDrawableTop" format="reference" /> <attr name="ptrDrawableBottom" format="reference" /> </declare-styleable> </resources>
最后完成了从网页读取信息,展示在手机上的效果,并且完善了之前功能的下拉刷新部分。不过对于html的文本在android设备图片显示的问题依然没有得到非常完美的解决办法。实在无法处理网页中的图片在Andorid设备上的布局和大小,希望之后能获得一个完美的解决方案。