<pre name="code" class="java">public class ListViewAdapter extends BaseAdapter
{
Context mContext = ViewSavedCity.instance;
//Context mContext = ViewSavedCity.this;
private LayoutInflater inflater = (LayoutInflater) mContext.getSystemService("layout_inflater");
@Override
public int getCount()//控制该Adapter将会包含多少个列表项
{
return ((ViewSavedCity)mContext).list.size();
}
@Override
public Object getItem(int position)
{
//返回值决定第position处的列表项的内容
return ((ViewSavedCity)mContext).list.get(position);
}
@Override
public long getItemId(int position)
{
//返回值决定第position处的列表项的内容
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view;
ViewHolder holder = null;
if (convertView == null)
{
//setContentView()一旦调用, layout就会立刻显示UI;
//而inflate只会把Layout形成一个以view类实现成的对象,
//有需要时再用setContentView(view)显示出来。
//一般在activity中通过setContentView()将界面显示出来,
//但是如果在非activity中如何对控件布局设置操作了,
//这就需要LayoutInflater动态加载。
convertView = inflater.inflate(R.layout.listview, parent, false);
view = convertView;
holder = new ViewHolder();
//findViewById 这个方法只有 activity和view才有。 自定义adapter并没有这个方法吧。
//并且convertView.findViewById 还涉及到了listview的优化问题
holder.cityName = (TextView)view.findViewById(R.id.cityName);
holder.date = (TextView)view.findViewById(R.id.date);
holder.temp = (TextView)view.findViewById(R.id.temp);
holder.weather = (TextView)view.findViewById(R.id.weather);
holder.index = (TextView)view.findViewById(R.id.index);
view.setTag(holder);//将holder 添加到动态生成的View里面
//控件声明都封装在holder里,执行Click事件要写holder.button.onClickListener...
// findViewById()默认是访问setContentView(R.layout.xxxx);这个布局,如果是获取
//一项item里的控件就要先找到item所在的布局layout文件获得一个view对象
//然后用view.findViewById()
}
else
{
holder=(ViewHolder) convertView.getTag();
}
holder.cityName.setText(String.valueOf(((ViewSavedCity)mContext).list.get(position).get("cityName")));
holder.temp.setText(String.valueOf(((ViewSavedCity)mContext).list.get(position).get("temp")));
holder.weather.setText(String.valueOf(((ViewSavedCity)mContext).list.get(position).get("weather")));
holder.index.setText(String.valueOf(((ViewSavedCity)mContext).list.get(position).get("index")));
holder.date.setText(String.valueOf(((ViewSavedCity)mContext).list.get(position).get("date_y")));
//view.setTag(holder);//将holder 添加到动态生成的View里面
setBackground(position,convertView);
// 为ListView设置隔行不同的背景颜色
// 返回的convertView对象将作为ListView的列表项
return convertView;
}
private class ViewHolder
{
TextView cityName;
TextView temp;
TextView weather;
TextView date;
TextView index;
}
考核第一轮过后代码任务可能不会特别重了,剩下该做的是完成翻页功能,按钮美化,重复按一个button的bug这几件事了,翻页功能刚刚终于测试成功了第二轮是面试加笔试,既要考java基础又要考android的知识。其实我越来越觉得除了研发其他工作室的招新好水..至于为什么水就不说了,有目共睹就好了。。
今晚收到外婆心脏问题住院了,还因为心跳突然从40/min加速到140/min而被医院下了病危通知书,心情很复杂,很难过。外婆从小就对我们几个孩子不错,好的坏的我们小孩自己能分清楚,至少对我们,她是无私的。奶奶也因为胆结石住院了。这个暑假是我除了初三的暑假去北京度假的第二个没在家的暑假,没想到会有这么多事。听到这些事,我第一反应当然是我要回家。但是,我面对着考核,我真的不能放弃幸好他们都还没什么事,幸好爸妈他们很体谅我没要我赶回去让我留在学校完成好考核。么么哒,八月份再回家吧。
今天我想写一写关于listview的接口继承类baseadapter的重写,有时候我想偷懒不写,虽然我现在掌握了,但是我还是很怕我又忘了,所以还是写一写吧
扩展BaseAdapter有很多的好处,如扩展BaseAdapter可以取得对Adapter最大的控制权:陈谷要创建多少个列表项,每个列表项的组件都由开发者也就是你自己来决定,而且在listview的接口上,扩展BaseAdapter有个很大的优势,那就是高效率!
扩展BaseAdapter主要需要重写如下四个方法
1.getCount():这个方法的返回值控制该Adapter将会包含多少个列表项
· 2.getItem(int position):该方法的返回值决定第position处的列表项的内容
3.getItemId(int positon):该方法的返回值决定第position处的列表项的ID
4.getView(int position,VIew convertView,ViewGroup parent):该方法的返回值决定第position处的列表项组件
下面我就将我天气预报查看保存城市的BaseAdapter重写的demo贴上来讲一讲怎么高效率了
ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。
当我们判断 convertView == null 的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。(看下面代码中)
如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。
也就是说如果一个手机屏幕能显示多少项的item就产生多少个view,重复利用看不到的view 而不是再生成一个view,这如果在大量的数据中处理的话,是有很大优势的!
睡啦。。本来打算早点睡的。。码农的蛋疼 晚安