当前位置: 首页 > news >正文

网站开发 需要用到什么软件网站访问统计报告模板

网站开发 需要用到什么软件,网站访问统计报告模板,长春网站优化平台,wordpress feed插件前言#xff1a;对于listView的BaseAdapter的派生#xff0c;难度比较大。最难理解的莫过于getView(int position, View convertView, ViewGroup parent)这个函数是如何产生每条记录的#xff0c;有些博客中利用holderView#xff0c;有些博客却没有用#xff0c;种种方法… 前言对于listView的BaseAdapter的派生难度比较大。最难理解的莫过于getView(int position, View convertView, ViewGroup parent)这个函数是如何产生每条记录的有些博客中利用holderView有些博客却没有用种种方法之间有什么异同今天我们就来揭开这个绘制ITEM机制的面纱。 本篇借助《PullToRefresh使用详解(二)---重写BaseAdapter实现复杂XML下拉刷新》的例子。所以本篇对于代码的讲解就比较粗略如果有读者对于如何重写BaseAdapter不太熟悉的话请先移步看看这篇文章然后再回来这里相信会有不一样的收获。 一、ConvertView回收机制 工作原理: 1、ListView 针对List中每个item要求 adapter “给我一个视图” (getView)。 2、一个新的视图被返回并显示 如果我们有上亿个项目要显示怎么办为每个项目创建一个新视图NO!这不可能 实际上Android为你缓存了视图。Android中有个叫做Recycler的构件下图是他的工作原理 如果你有10亿个项目(item)其中只有可见的项目存在内存中其他的在Recycler中。 ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。 当item1滚出屏幕并且一个新的项目从屏幕低端上来时ListView再请求一个type1视图。convertView此时不是空值了它的值是item1。你只需设定新的数据然后返回convertView不必重新创建一个视图。   以上摘自《ListView中getView的原理如何在ListView中放置多个item》 也就是说 1、android的listView在初始化的时候如上面这个列表整个屏幕只能放下7个item那么listView在初始化时就会只创建7个view对于这些view也就是参数中的convertView。 2、那问题来了当继续网上滑动item1消失了而item8出来了。那系统还是为item8重新创建一个新的convertView吗另一个问题,item1的convertView去哪了销毁回收资源还是重新利用如果你是系统设计者你会怎么做大家想想如果为每个要显示的item都创建新convertView是不是太浪费了况且对于item1的convertView已经没用了我们何不把它拿来给item8用。对系统就是这样做的这就是convertView的回收机制。就是将那些不再被用的ITEM的convertView重新给即将显示的ITEM使用的机制 二、例子 先给大家看一下单个ITEM的布局图片对于具体布局代码看源码吧。 对于JAVA源码我们先看这种方式写的convertView的生成方法。 package com.example.try_pulltorefresh_map; /*** 完成了从TXT文本中提取并向下刷新* blog:http://blog.csdn.net/harvic880925* author harvic* date 2014-5-8* */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray;import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode; import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;import android.os.Bundle; import android.app.ListActivity; import android.content.Context; import android.graphics.Color; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView;public class MainActivity extends ListActivity {private ArrayListHashMapString, Object listItem new ArrayListHashMapString, Object();private PullToRefreshListView mPullRefreshListView;MyAdapter adapternull;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mPullRefreshListView (PullToRefreshListView) findViewById(R.id.pull_refresh_list);//设定下拉监听函数mPullRefreshListView.setOnRefreshListener(new OnRefreshListenerListView() {Overridepublic void onRefresh(PullToRefreshBaseListView refreshView) {String label DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);// Update the LastUpdatedLabelrefreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);// Do work to refresh the list here.}});mPullRefreshListView.setMode(Mode.PULL_FROM_END);//设置底部下拉刷新模式listItemgetData();//获取LIST数据adapter new MyAdapter(this);//设置适配器ListView actualListView mPullRefreshListView.getRefreshableView();actualListView.setAdapter(adapter); }private ArrayListHashMapString, Object getData() {ArrayListHashMapString, Object list new ArrayListHashMapString, Object();HashMapString, Object map new HashMapString, Object();InputStream inputStream;try {inputStreamthis.getAssets().open(my_home_friends.txt);String jsonreadTextFile(inputStream);JSONArray array new JSONArray(json);for (int i 0; i array.length(); i) {map new HashMapString, Object();map.put(name, array.getJSONObject(i).getString(name));map.put(info, array.getJSONObject(i).getString(info));map.put(img,array.getJSONObject(i).getString(photo));list.add(map);}return list; } catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return list; }public final class ViewHolder{public TextView name;public TextView info;public TextView attentntion;} public class MyAdapter extends BaseAdapter{private LayoutInflater mInflater;public MyAdapter(Context context){this.mInflater LayoutInflater.from(context);}Overridepublic int getCount() {// TODO Auto-generated method stubreturn listItem.size();}Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn null;}Overridepublic long getItemId(int arg0) {// TODO Auto-generated method stubreturn 0;}Overridepublic View getView(int position, View convertView, ViewGroup parent) {System.out.println(position:position convertView:convertView);ViewHolder holder null;holdernew ViewHolder(); convertView mInflater.inflate(R.layout.item, null);holder.name (TextView)convertView.findViewById(R.id.name);holder.info (TextView)convertView.findViewById(R.id.info);holder.attentntion(TextView)convertView.findViewById(R.id.attention);holder.name.setText((String)listItem.get(position).get(name));holder.info.setText((String)listItem.get(position).get(info));final TextView attentionholder.attentntion;holder.attentntion.setOnClickListener(new View.OnClickListener() { Overridepublic void onClick(View v) {// TODO Auto-generated method stubattention.setTextColor(Color.RED);}});convertView.setTag(holder); return convertView;}}工具类/*** * param inputStream* return*/public String readTextFile(InputStream inputStream) {String readedStr ;BufferedReader br;try {br new BufferedReader(new InputStreamReader(inputStream, UTF-8));String tmp;while ((tmp br.readLine()) ! null) {readedStr tmp;}br.close();inputStream.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return readedStr;}}以上代码凡是懂如何派生自BaseAdapter的应该都可以看懂这里就不再多讲只看核心代码摘录如下Override public View getView(int position, View convertView, ViewGroup parent) {System.out.println(position:position convertView:convertView);ViewHolder holder null;holdernew ViewHolder(); convertView mInflater.inflate(R.layout.item, null);holder.name (TextView)convertView.findViewById(R.id.name);holder.info (TextView)convertView.findViewById(R.id.info);holder.attentntion(TextView)convertView.findViewById(R.id.attention);holder.name.setText((String)listItem.get(position).get(name));holder.info.setText((String)listItem.get(position).get(info));final TextView attentionholder.attentntion;holder.attentntion.setOnClickListener(new View.OnClickListener() { Overridepublic void onClick(View v) {// TODO Auto-generated method stubattention.setTextColor(Color.RED);}}); return convertView; }这里利用system.out.println对convertView进行捕捉运行如果如下 手机初始化是这样子的 根据上面我们讲的理论在初始化时整个屏幕能放下三个ITEM所以会创建三个全新的convertView。当我往下拉一个ITEM出现第四个ITEM的时候就会回收第一个ITEM的convertView给第四个。捕捉结果如下 清楚的看到前四个convertView为NULL当第五个ITEM出现时此时由于第一个ITEM肯定已经滚出屏幕所以将其重新传给即将出现的item5使用。我们上面说的第四个ITEM出现的时候就应该不再创建新convertView了我想android开发者在考虑多创建一个ITEM的目的在于更安全吧。 回到上面的代码好像看着代码没有任何问题我在里面写了个clickListener当点击“关注”的时候字体会变红试一下。             点击“关注”                     下拉后再拉回来 问题出现了当拉回来的时候“关注”不再红了为什么 问题出在代码上 holdernew ViewHolder(); convertView mInflater.inflate(R.layout.item, null); holder.name (TextView)convertView.findViewById(R.id.name); holder.info (TextView)convertView.findViewById(R.id.info); holder.attentntion(TextView)convertView.findViewById(R.id.attention); 每次运行getView获取当前ITEM时都会重新new 一个viewHolder与R.layout.item绑定也就是说每次都会产生一个新布局赋值给convertView让其显示。而我们上面讲了android会将回收过来的convertView返回给即将显示的getView使用以节约资源。而我们这里却没有领情每次都重新创建一个布局赋给convertView由于每次都创建一个新布局所以当ITEM1被重新拉回来显示的时候由于是重新创建的布局当然是初始状态。“关注”当然也就是黑色的了。改进 Override public View getView(int position, View convertView, ViewGroup parent) {System.out.println(position:position convertView:convertView);ViewHolder holder null;if (convertView null) {holdernew ViewHolder(); convertView mInflater.inflate(R.layout.item, null);holder.name (TextView)convertView.findViewById(R.id.name);holder.info (TextView)convertView.findViewById(R.id.info);holder.attentntion(TextView)convertView.findViewById(R.id.attention);convertView.setTag(holder); }else {holder (ViewHolder)convertView.getTag();}holder.name.setText((String)listItem.get(position).get(name));holder.info.setText((String)listItem.get(position).get(info));final TextView attentionholder.attentntion;holder.attentntion.setOnClickListener(new View.OnClickListener() { Overridepublic void onClick(View v) {// TODO Auto-generated method stubattention.setTextColor(Color.RED);}});return convertView; } 不同的部分在这ViewHolder holder null;if (convertView null) {holdernew ViewHolder(); convertView mInflater.inflate(R.layout.item, null); holder.name (TextView)convertView.findViewById(R.id.name); holder.info (TextView)convertView.findViewById(R.id.info); holder.attentntion(TextView)convertView.findViewById(R.id.attention); convertView.setTag(holder); }else {holder (ViewHolder)convertView.getTag(); }当convertView为空即初始化创建时我们就将生成的布局利用setTag()保存在convertView中当convertView利用回收机制回收过来让我们再次使用时我们通过getTag()将保存的布局取出来重新将布局里的各个控件重新赋值就可以了。这里就利用了android-listView的回收机制。 再看关注的点击事件运行的怎样看第二张图当拉下去再拉回来的时候一切正常但当我们再往下拉第三张图问题又出现了明明没有点P-5为什么关注反而是红色的 这是因为P-5用的是P-1回收来的convertView!!!而P-1的convertView的布局里“关注”是红色的。所以只要回收机制在我们就没有办法改变从P-1回收来的convertView里的图片布局除非人为的将其重置 理解了这个问题以后我们想想解决办法。 首先申请一个arrayList  attentionArr变量保存用户点击“关注”的ITEM的position然后在绘制当前ITEM时根据这个position是否在attentionArr里来判断是不是将“关注”重新变红。 代码如下 Override public View getView(final int position, View convertView, ViewGroup parent) {System.out.println(position:position convertView:convertView);ViewHolder holder null;if (convertView null) {holdernew ViewHolder(); convertView mInflater.inflate(R.layout.item, null);holder.name (TextView)convertView.findViewById(R.id.name);holder.info (TextView)convertView.findViewById(R.id.info);holder.attentntion(TextView)convertView.findViewById(R.id.attention);convertView.setTag(holder); }else {holder (ViewHolder)convertView.getTag();}holder.name.setText((String)listItem.get(position).get(name));holder.info.setText((String)listItem.get(position).get(info));final TextView attentionholder.attentntion;//根据当前position判断重新制做样式if (attentionArr.contains(position)) {attention.setTextColor(Color.RED);}else {attention.setTextColor(Color.BLACK);}holder.attentntion.setOnClickListener(new View.OnClickListener() { Overridepublic void onClick(View v) {// TODO Auto-generated method stubattention.setTextColor(Color.RED);attentionArr.add(position);//在点击时将position加入其中}});return convertView; }理解代码难度不大首先在OnClickListener时将position加入到attentionArr数组中然后在getView里判断当前position是不是用户点击过的即是否包含在attentionArr数组中如果是则将“关注”置为红色否则置为初始色黑色。
http://www.zqtcl.cn/news/403877/

相关文章:

  • 外贸开发网站建设注册会计师协会
  • 莆田建设网站dw网页设计作品及源码
  • 360免费建站视频淘宝客的网站怎么做
  • 四川自助seo建站短视频推广计划
  • 网站建设案例的公司黄冈网站建设公司
  • 做淘客网站需要营业执照吗制作网站公
  • 手机网站开发的目的鲁班设计远程工作
  • 宿迁网站建设要多少钱高密市住房和城乡建设局网站
  • 咸阳网站建设公司哪家好wordpress访客ip记录
  • 厦门建设银行网站那个网站做效果图电脑配置
  • 人才网站建设医院网站建设的好处
  • 房屋装修网站模板html5做网站
  • 网站建设需要的硬件网站建设知名公司排名
  • 绥化网站建设私自搭建vps犯法吗
  • 建设专业网站哪家比较好小程序源码是什么意思
  • 网站设计一般包括什么给公司做网站数据分析
  • 网站根目录在哪里1024cctvcom戊人影祝
  • wordpress转发微信南宁seo企业优化
  • 红旗渠建设集团网站昭通网络推广
  • 海陵区建设局网站计算机网站建设考试试卷
  • 佛山做网站3lue网站开发招标网
  • 粘贴以下代码到网站首页代码的与标签之间渭南软件开发
  • 企业网站建设必要性上海网站建设报价表
  • 陕西省建设厅申报网站一个主体如何添加网站
  • 做网站业务员提成几个点wordpress 地图导航代码
  • 软件下载网站排行住房和城乡建设部办公厅网站
  • 贵阳网站建设需要多少钱百度资源搜索平台
  • 做安全防护信息的网站wordpress初始密码
  • 广东企业网站seo哪里好微信公众号怎么创建文章
  • 建行网站登录不了wordpress好主题