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(); }

最新文章

  1. python 学习总结
  2. 【原创】CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(5)使用放射渐变制作光影效果
  3. haslayout
  4. 远程调试Java程序
  5. poj 2195 Going Home
  6. C语言中的字符串
  7. js String对象
  8. python :列表 字典 集合 类 ----局部变量可以改全局变量
  9. Java多线程同步问题的探究
  10. WCF学习笔记
  11. CreateThread函数&amp;amp;&amp;amp;CString::GetBuffer函数
  12. char (*(*p[3])( int ))[5] 等等一系列 左右法则
  13. C连接MySQL数据库开发之Windows环境配置及测试
  14. 给ie浏览器添加推荐浏览器提示
  15. 【vue】iView-admin2.0动态菜单路由
  16. JavaEE第六周
  17. laravel-debugbar安装
  18. swift Class的内存布局
  19. Python+OpenCV图像处理(十一)—— 图像金字塔
  20. 个人项目:实现wc.exe(Java)

热门文章

  1. 洛谷——P2504 [HAOI2006]聪明的猴子
  2. HDU 1836 畅通工程
  3. Java_集合总结
  4. broker监控dataguard配置
  5. noip模拟赛 排序
  6. nyoj_37_回文字符串_201403121649
  7. HDU 5293
  8. javascript打开本地应用
  9. CSS3选择器(全)
  10. Android---keycode值以及相应名称