1.先写遇到的问题:

a.ListView只显示一个item。

listview只显示一个item,并且做了listview的点击事件监听打印 Bean 对象的属性和哈希值,发现只有显示的那个 Bean 对象有属性值,其他item显示的 Bean 对象属性值为null,但是 Bean对象有唯一哈希值,说明 Bean 对象成功创建了,但是是什么原因导致其他属性值为空的呢?经过检查发现。每个对象是创建出来了,创建了第二个对象时,本来用第二个对象去引用属性值,结果用了第一个去引用属性值。

错误代码:

 Beauty beauty = new Beauty();
beauty.age = "20";
beauty.name = "西施";
beauty.icon = mContext.getResources().getDrawable(R.drawable.a, null);
arraylist.add(beauty); 7 Beauty beauty1 = new Beauty();
8 beauty.age = "18";
9 beauty.name = "貂蝉";
10 beauty.icon = mContext.getResources().getDrawable(R.drawable.b, null);
arraylist.add(beauty1);

正确为:

  Beauty beauty = new Beauty();
beauty.age = "20";
beauty.name = "西施";
beauty.icon = mContext.getResources().getDrawable(R.drawable.a, null);
arraylist.add(beauty); 7 Beauty beauty1 = new Beauty();
8 beauty1.age = "18";
9 beauty1.name = "貂蝉";
10 beauty1.icon = mContext.getResources().getDrawable(R.drawable.b, null);
arraylist.add(beauty1);

b.只能显示一页,滑动lLIstView时,出现了ViewHolder空指针问题。

优化自定义adapter的getView()里面的FindViewById()时,从view里获取存储的ViewHolder对象写成了局部对象,当滑动listview再次获取ViewHolder时,由于是局部对象,获取不到报空指针。

 public View getView(int position, View convertView, ViewGroup parent) {

         View view = null;
ViewHolder viewholder = null; if (convertView != null) {
view = convertView;
viewholder = (ViewHolder) view.getTag();//从view里获取存储的ViewHolder,写成了局部对象。
} else {
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(item, parent, false); //每次调用getView 都会执行FindViewById所以继续优化。
viewholder = new ViewHolder();
viewholder.viewHolderImageview= (ImageView) view.findViewById(R.id.IV_imageview);
viewholder.viewHolderTextview_1 = (TextView) view.findViewById(R.id.TV_age);
viewholder.viewHolderTextview_2 = (TextView) view.findViewById(R.id.TV_name);
view.setTag(viewholder);//将viewholder存储在view中
}
}

2.自定义ListView的使用。

a.先把Context赋值为全局变量(后面会用到),在获取XML中的listview的ID。

b.创建ArrayList和Bean对象,并用ArrayList封装Bean对象。

c.创建Adapter,继承BaseAdapter。

d.listview设置显示的adapter。

e.设置listview的监听事件,实现 AdapterView.OnItemClickListener。

  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this; lv_1=(ListView)findViewById(R.id.lv_1);
ArrayList<Beauty> arraylist= BeautyUtlis.getAllBeauty(mContext); MyAdapter myadapter=new MyAdapter(mContext,R.layout.item_1,arraylist);
lv_1.setAdapter(myadapter); //点击事件
lv_1.setOnItemClickListener(this); }

b.通过ArrayList封装Bean对象。

创建Bean。

 public class Beauty {
public String age;
public String name;
public Drawable icon; public Beauty() {
} public Beauty(String age, String name, Drawable icon) {
this.age = age;
this.name = name;
this.icon = icon;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public Drawable getIcon() {
return icon;
} public void setIcon(Drawable icon) {
this.icon = icon;
}
}

创建ArrayList集合用于封装Bean。循环是为了显示更多条目。

 public class BeautyUtlis {

 public static ArrayList<Beauty> getAllBeauty(Context mContext) {

         ArrayList<Beauty> arraylist = new ArrayList<>();

 for(int i=0;i<3;i++) {
Beauty beauty = new Beauty();
beauty.age = "20";
beauty.name = "西施";
beauty.icon = mContext.getResources().getDrawable(R.drawable.a, null);
arraylist.add(beauty); Beauty beauty1 = new Beauty();
beauty1.age = "18";
beauty1.name = "貂蝉";
beauty1.icon = mContext.getResources().getDrawable(R.drawable.b, null);
arraylist.add(beauty1); Beauty beauty2 = new Beauty();
beauty2.age = "22";
beauty2.name = "杨贵妃";
beauty2.icon = mContext.getResources().getDrawable(R.drawable.c, null);
arraylist.add(beauty2); Beauty beauty3 = new Beauty();
beauty3.age = "20";
beauty3.name = "阿科";
beauty3.icon = mContext.getResources().getDrawable(R.drawable.d, null);
arraylist.add(beauty3); }
return arraylist;
}
}

c.创建Adapter,继承BaseAdapter,通过自定义的构造方法传Context,item  ID,ArrayList封装的Bean对象。

 public class MyAdapter extends BaseAdapter {

     private final Context mContext;
private final ArrayList<Beauty> arraylist;
private final int item; public MyAdapter(Context mContext, int item_1, ArrayList<Beauty> araylist) {
this.mContext = mContext;
this.arraylist = araylist;
this.item = item_1;
} //listview 显示多少个条目
@Override
public int getCount() {
return arraylist.size();
} //根据postiion获取条目对应的Bean数据
@Override
public Object getItem(int position) {
return arraylist.get(position);
} //获取position条目的ID
@Override
public long getItemId(int position) {
return position;
} /**
* getview:告诉listview条目上显示的内容;返回一个View对象作为条目上的内容展示,该方法返回什么样的view,Listview的条目上就显示什么样的view。 * //屏幕上每显示一个条目getview方法就会被调用一次;
convertView:曾经使用过的view对象,可以被重复使用,使用前要判断。
**/
@Override
public View getView(int position, View convertView, ViewGroup parent) { View view = null;
ViewHolder viewholder = null;

//判断convertView是否为空,为空创建新的View,不为空则复用被推出页面外的view
if (convertView != null) {
view = convertView;
viewholder = (ViewHolder) view.getTag();//从view里获取存储的ViewHolder
} else {
LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(item, parent, false); //每次调用getView 都会执行FindViewById所以继续优化。
viewholder = new ViewHolder();
viewholder.viewHolderImageview= (ImageView) view.findViewById(R.id.IV_imageview);
viewholder.viewHolderTextview_1 = (TextView) view.findViewById(R.id.TV_age);
viewholder.viewHolderTextview_2 = (TextView) view.findViewById(R.id.TV_name);
view.setTag(viewholder);//将viewholder存储在view中
}
//获取Bean对象 Beauty beauty = arraylist.get(position); viewholder.viewHolderImageview.setImageDrawable(beauty.getIcon());
viewholder.viewHolderTextview_1.setText(beauty.getAge());
viewholder.viewHolderTextview_2.setText(beauty.getName());
return view;
} //优化FindVIewById
class ViewHolder {
ImageView viewHolderImageview;
TextView viewHolderTextview_1;
TextView viewHolderTextview_2;
}
}

d.listview设置显示的adapter。

  lv_1.setAdapter(myadapter);

e.设置listview的监听事件,实现 AdapterView.OnItemClickListener。简单打印。

  {
.........
lv_1.setOnItemClickListener(this); } @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//获取条目对应的对象
Beauty beauty = (Beauty) parent.getItemAtPosition(position);

Toast.makeText(mContext,"点击了第"+position+"位置,"+"姓名叫:"+beauty.name+",年龄是:"+beauty.age,Toast.LENGTH_LONG).show(); }

ListView使用、ListView优化和遇到的问题的更多相关文章

  1. 转-ListView的性能优化之convertView和viewHolder

    ListView的性能优化之convertView和viewHolder 2014-05-14 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/ ...

  2. 【Android】以BaseAdapter做适配器的ListView及其性能优化

    适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ...

  3. ListView复用和优化详解

    我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率,而内部实现的一种优化,牺牲一点内存.而 ...

  4. 浅谈ScrollView嵌套ListView及ListView嵌套的高度计算

    引言 在Android开发中,我们有时会需要使用ScrollView中嵌套ListView的需求.例如:在展示信息的ListView上还有一部分信息展示区域,并且要求这部分信息展示区域在ListVie ...

  5. Listview嵌套Listview

    今天做项目,打算模仿淘宝的订单管理,需要Listview嵌套Listview,都是两个控件都是沿着一个方向滑动的,嵌套在一起不幸福,以下是解决方案,打个笔记,以后估计还得用: 其中onMeasure函 ...

  6. 重写ListView解决ListView内部ViewPaper滑动事件冲突问题

    非常easy 重写ListView 其它类似问题解决ScrollView嵌套ViewPager出现的滑动冲突问题 http://blog.csdn.net/zhangyiacm/article/det ...

  7. 使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突

    在项目中,我们常常会遇到一个ScrollView里面会嵌套ListView的情况,但往往你会发现,ListView和ScrollView的滚动时间会有冲突问题,造成ListView不能完全显示.虽然网 ...

  8. UWP ListView嵌套ListView

    要求:加载全部的订单,每个订单里面有一个或者多个产品,在列表中要展现出来, 1. xaml界面 步骤:1.这里使用的是x:bind绑定所以要引入实体类命名空间(OrderList集合中类的命名空间): ...

  9. Android之ScrollView嵌套ListView冲突 (listView只显示一行)

    在ScrollView中嵌套使用ListView,ListView只会显示一行多一点.两者进行嵌套,即会发生冲突.由于ListView本身都继承于ScrollView,一旦在ScrollView中嵌套 ...

  10. ListView之性能优化

    listview加载的核心是其adapter,本文通过减少adapter中创建.处理view的次数来提高listview加载的性能,总共分四个层次: 0.最原始的加载 1.利用convertView ...

随机推荐

  1. 4 pandas模块,Series类

      对gtx图像进行操作,使用numpy知识 如果让gtx这张图片在竖直方向上进行颠倒.   如果让gtx这张图片左右颠倒呢?   如果水平和竖直方向都要颠倒呢?   如果需要将gtx的颜色改变一下呢 ...

  2. Monthly Expense POJ 二分

    Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...

  3. springMVC入门笔记

    目录 一.回顾Servlet 二.SpringMVC简介 三.搭建SpringMVC第一个案例 四.简单流程及配置 五.使用注解开发Controller 六.参数绑定 基本数据类型的获取: 如果表单域 ...

  4. 一键免费升级Windows 10

    2015年3月18日,在深圳召开的微软Windows硬件project产业创新峰会(WinHEC)发布了一些震撼消息. 微软计划于今年夏天正式推出Windows 10操作系统.将在190个国家发布,总 ...

  5. android 用java代码设置布局、视图View的宽度/高度或自适应

    在achat项目中,对话内容的长宽设置为自适应.可是假设文本内容太多,则宽度几乎相同布满,若自己说的和对方说的都非常多内容.则满屏都是文字.则不easy分辨出是来自别人说的还是自己说的.那么须要对本身 ...

  6. 开启我的PHP学习之旅

    第二课 LAMP: Linux apache ngix PHP 第三课 搭建server方式: 1.集成安装环境 XAMPP软件包:www.apachefriends.org 2.单独配置 第四课 X ...

  7. Linux -- 内存控制之oom killer机制及代码分析

    近期,线上一些内存占用比較敏感的应用.在訪问峰值的时候,偶尔会被kill掉,导致服务重新启动.发现是Linux的out-of-memory kiiler的机制触发的. http://linux-mm. ...

  8. javascript 打印函数名称和被引用的函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. jQuery事件整理回想

    一.事件 1.载入DOM $(document).ready() 这个第一节里具体介绍了 2.事件绑定 jQuery定义了bind()方法作为统一的接口.用来为每个匹配元素绑定事件处理程序. 其基本的 ...

  10. 用Arduino+OSC建立一个iPad铁路王国巡视机

    翻译自:http://blog.mydream.com.hk/howto/build-up-a-ipad-plarail-patrol-with-arduino-osc 简单介绍 这个教程告诉你怎样建 ...