Android:ListView、BaseAdapter、convertView、ListView优化及事件、notifyDataSetChanged()

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@Override
protected  void  onCreate(Bundle savedInstanceState)
{
     super .onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
                                                                                                                               
     final  ArrayList<String> title =  new  ArrayList<String>();
     for  ( int  i =  0 ; i <  20 ; i++)
     {
         title.add( "标题"  + i);
     }
                                                                                                                               
     ListView listView = (ListView) findViewById(R.id.listView1);
     listView.setAdapter( new  BaseAdapter()
     {
         @Override
         public  View getView( int  position, View convertView, ViewGroup parent) //执行数等于当前页面出现的行数,convertView指滚动消失的layout
         {
             Log.e( "getView" "调用getView" + i++ +  "convertView:"  + convertView);
             LayoutInflater inf = getLayoutInflater(); //通过LayoutInflater将布局id转换到对象
             RelativeLayout relativeLayout = (RelativeLayout) inf.inflate(R.layout.relat,  null );
             TextView titleview = (TextView) relativeLayout.findViewById(R.id.textView1); //通过布局找到里面的控件
             titleview.setText(title.get(position)); //得到容器内的内容
             return  relativeLayout;
         }
                                                                                                                                   
         @Override
         public  long  getItemId( int  position)
         {
             return  0 ;
         }
                                                                                                                                   
         @Override
         public  Object getItem( int  position)
         {
             return  null ;
         }
                                                                                                                                   
         @Override
         //先执行getCount再执行getView,出现新行数时再次执行getCount
         //listview清单里要设置高度match_parent
         //每次点击屏幕一次都会先执行getCount
         public  int  getCount()
         {
             Log.e( "getCount" "调用getCount" + j++);
             return  title.size();
         }
     });
}




复用converview:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ListView listView = (ListView) findViewById(R.id.listView1);
listView.setAdapter( new  BaseAdapter()
{
     @Override
     public  View getView( int  position, View convertView, ViewGroup parent) //执行数等于当前页面出现的行数,convertView指滚动消失的layout
     {        
         //复用converview
         RelativeLayout relativeLayout =  null ;
         if (convertView ==  null )
         {
             LayoutInflater inf = getLayoutInflater();
             relativeLayout = (RelativeLayout) inf.inflate(R.layout.relat,  null );
         }
         else
         {
             relativeLayout = (RelativeLayout) convertView;
         }
                                                                                                                   
         TextView titleView = (TextView) relativeLayout.findViewById(R.id.textView1);
         titleView.setText(title.get(position));
         return  relativeLayout;
     }




继续优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
public  class  MainActivity  extends  Activity
{
     int  imID =  0 ;
     class  Msg //内容
     {
         String mTitle;
         String mSubtitle;
         String mTime;
         int  mImagID;
         public  Msg(String mTitle, String mSubtitle, String mTime,  int  mImagID)
         {
             super ();
             this .mTitle = mTitle;
             this .mSubtitle = mSubtitle;
             this .mTime = mTime;
             this .mImagID = mImagID;
         }
                                                                                                            
     }
                                                                                                        
     class  ViewHolder //控件
     {
         TextView viewTitle;
         TextView viewSubtitle;
         TextView viewTime;
         ImageView viewImage;
     }
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
                                                                                                            
         Date timeNow =  new  Date();
         SimpleDateFormat timeFormat =  new  SimpleDateFormat( "HH:mm:ss" );
         String time = timeFormat.format(timeNow);
                                                                                                            
         final  ArrayList<Msg> msgList =  new  ArrayList<Msg>();
         for  ( int  i =  0 ; i <  30 ; i++) //选择图片
         {
                                                                                                                
             if (i %  4  ==  0 )
             {
                 imID = R.drawable.ic_launcher;
             }
             if (i %  4  ==  1 )
             {
                 imID = R.drawable.ic_1;
             }
             if (i %  4  ==  2 )
             {
                 imID = R.drawable.ic_2;
             }
             if (i %  4  ==  3 )
             {
                 imID = R.drawable.ic_3;
             }
                                                                                                                
             Msg msg =  new  Msg( "标题"  + i,  "内容"  + i, time ,imID);
             msgList.add(msg);
         }
                                                                                                            
         ListView listView = (ListView) findViewById(R.id.listView1);
         listView.setAdapter( new  BaseAdapter()
         {
             ViewHolder holder =  null ;
             @Override
             public  View getView( int  position, View convertView, ViewGroup parent)
             {
                 RelativeLayout relout =  null ;
                 if  (convertView ==  null ) //创建首页时才find控件
                 {
                     LayoutInflater layoutInflater =getLayoutInflater();
                     relout = (RelativeLayout) layoutInflater.inflate(R.layout.relaout,  null );
                                                                                                                        
                     holder =  new  ViewHolder();
                     holder.viewTitle= (TextView) relout.findViewById(R.id.textView_title);
                     holder.viewSubtitle = (TextView) relout.findViewById(R.id.textView_subtitle);
                     holder.viewTime = (TextView) relout.findViewById(R.id.textView_time);
                     holder.viewImage = (ImageView) relout.findViewById(R.id.imageView1);
                                                                                                                        
                     relout.setTag(holder);
                 }
                 else //否则复用layout和view
                 {
                     relout = (RelativeLayout) convertView;
                     holder = (ViewHolder) relout.getTag(); //记得得到holder
                                                                                                                        
                 }
                                                                                                                    
                 Msg msg = msgList.get(position);
                                                                                                                    
                 holder.viewTitle.setText(msg.mTitle);
                 holder.viewSubtitle.setText(msg.mSubtitle);
                 holder.viewTime.setText(msg.mTime);
                 holder.viewImage.setImageResource(msg.mImagID); //设置图片的方法
                 return  relout;
             }
                                                                                                                
             @Override
             public  long  getItemId( int  position)
             {
                 return  0 ;
             }
                                                                                                                
             @Override
             public  Object getItem( int  position)
             {
                 return  null ;
             }
                                                                                                                
             @Override
             public  int  getCount()
             {
                 return  msgList.size();
             }
         });
     }
                                                                                                        
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.activity_main, menu);
         return  true ;
     }
                                                                                                        
}



点击按钮更新listview:Adapter使用notifyDataSetChanged()通知listview更新

3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private  void  btn1Click() //增加一行信息
{
     i++;
     data.add( "内容"  + i );
     arrAdapter.notifyDataSetChanged(); //Adapter通知listview做更新
}
private  void  btn2Click() //删除第一行信息
{
     if (data.size() <  1 )
     {
        Toast.makeText( this "信息已删除完毕!" , Toast.LENGTH_LONG).show();
     }
     else
     {
         data.remove( 0 );
         arrAdapter.notifyDataSetChanged(); //Adapter通知listview做更新
     }
}
private  void  btnsortClick() //对列表进行排序
{
     Collections.sort(data);
     arrAdapter.notifyDataSetChanged();
}



注:

1.LayoutInflater inflater = getLayoutInflater();

 layout = (RelativeLayout) inflater.inflate(R.layout.relayout, null);

 layout要通过LayoutInflater拿到。

2.getView返回layout,getCount()返回int。

3.layout.getTag()要转换为holder = (ViewHolder)。





本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1201270,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
75 20
Android经典面试题之图片Bitmap怎么做优化
|
2月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
45 1
|
2月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
66 4
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
44 5
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
3月前
|
Java Android开发 UED
安卓应用开发中的内存管理优化技巧
在安卓开发的广阔天地里,内存管理是一块让开发者既爱又恨的领域。它如同一位严苛的考官,时刻考验着开发者的智慧与耐心。然而,只要我们掌握了正确的优化技巧,就能够驯服这位考官,让我们的应用在性能和用户体验上更上一层楼。本文将带你走进内存管理的迷宫,用通俗易懂的语言解读那些看似复杂的优化策略,让你的开发之路更加顺畅。
76 2
|
3月前
|
Java Android开发 开发者
安卓应用开发中的线程管理优化技巧
【9月更文挑战第10天】在安卓开发的海洋里,线程管理犹如航行的风帆,掌握好它,能让应用乘风破浪,反之则可能遭遇性能的暗礁。本文将通过浅显易懂的语言和生动的比喻,带你探索如何优雅地处理安卓中的线程问题,从基础的线程创建到高级的线程池运用,让你的应用运行更加流畅。
|
3月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
87 0