ListView使用、ListView优化和遇到的问题
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优化和遇到的问题的更多相关文章
- 转-ListView的性能优化之convertView和viewHolder
		ListView的性能优化之convertView和viewHolder 2014-05-14 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/ ... 
- 【Android】以BaseAdapter做适配器的ListView及其性能优化
		适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import and ... 
- ListView复用和优化详解
		我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率,而内部实现的一种优化,牺牲一点内存.而 ... 
- 浅谈ScrollView嵌套ListView及ListView嵌套的高度计算
		引言 在Android开发中,我们有时会需要使用ScrollView中嵌套ListView的需求.例如:在展示信息的ListView上还有一部分信息展示区域,并且要求这部分信息展示区域在ListVie ... 
- Listview嵌套Listview
		今天做项目,打算模仿淘宝的订单管理,需要Listview嵌套Listview,都是两个控件都是沿着一个方向滑动的,嵌套在一起不幸福,以下是解决方案,打个笔记,以后估计还得用: 其中onMeasure函 ... 
- 重写ListView解决ListView内部ViewPaper滑动事件冲突问题
		非常easy 重写ListView 其它类似问题解决ScrollView嵌套ViewPager出现的滑动冲突问题 http://blog.csdn.net/zhangyiacm/article/det ... 
- 使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突
		在项目中,我们常常会遇到一个ScrollView里面会嵌套ListView的情况,但往往你会发现,ListView和ScrollView的滚动时间会有冲突问题,造成ListView不能完全显示.虽然网 ... 
- UWP  ListView嵌套ListView
		要求:加载全部的订单,每个订单里面有一个或者多个产品,在列表中要展现出来, 1. xaml界面 步骤:1.这里使用的是x:bind绑定所以要引入实体类命名空间(OrderList集合中类的命名空间): ... 
- Android之ScrollView嵌套ListView冲突 (listView只显示一行)
		在ScrollView中嵌套使用ListView,ListView只会显示一行多一点.两者进行嵌套,即会发生冲突.由于ListView本身都继承于ScrollView,一旦在ScrollView中嵌套 ... 
- ListView之性能优化
		listview加载的核心是其adapter,本文通过减少adapter中创建.处理view的次数来提高listview加载的性能,总共分四个层次: 0.最原始的加载 1.利用convertView ... 
随机推荐
- codevs2833 奇怪的梦境
			2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Aiden陷入了一个奇怪的梦境:他被困 ... 
- String s="a"+"b"+"c"+"d";创建了几个对象?
			对于如下代码: package reviewTest; /** * @ClassName: StringTest * @Description: 测试String的字符串相加优化 * @author ... 
- Python面向对象----继承, 重载
			1. 面向对象三大特性之继承. 继承的便捷是子类可以直接调用父类里面的方法和属性.(在强类型语言里面是只能调用公有成员), 不用重复的造轮子. 减少程序猿的负担.实现多态等上层结构 2. 父类代码 3 ... 
- PAT 1102 Invert a Binary Tree
			The following is from Max Howell @twitter: Google: 90% of our engineers use the software you wrote ( ... 
- PAT 1096. Consecutive Factors
			Among all the factors of a positive integer N, there may exist several consecutive numbers. For exam ... 
- PowerDesigner16.5 使用遇到的问题
			目录 1.PowerDesigner 菜单栏中没有 Datebase 2.PowerDesigner连接远程mysql数据库连接不上 3.怎样去掉窗口中的黑色网格线 4.设置默认"不为空&q ... 
- 12SSM整合
			u 三大框架基本概念 spring.SpringMVC.Mybatis u 整合思路 u 环境准备 u 工程结构 u SPRING + SPING MVC + MYBATIS 三大框架整合 ... 
- How to change java version in Linux
			How to change default Java version on Linux Posted on November 1, 2015 by Dan Nanni Leave a comment ... 
- JLOI2018 记
			2018JL省选记 又是一年省选.今年的我,依然好菜啊... [Day 0] 呼...好紧张,明天就省选了.下周就有学长退役了吧,机房又该恢复冷清了吧.只剩下为数不多的几个i7接送着来来往往的OIer ... 
- jsp param动作标签
			param 标签以"名字-值"对的形式为其它标签提供附加消息.这个标签与jsp:include.jsp:forward.jsp:plugin标签一起使用. param 动作标签 & ... 
