Android中,ListView优化的简单案例
程序员文章站
2022-07-14 12:50:02
...
Android中的mvc:
m: 数据Javabean
v: xml
c: adapter
1、首先在mainactivity.xml布局一个ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:fastScrollEnabled="true"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
注意,ListView当中的layout_height最好是match_parent,而不要去使用wrap_content,因为如果是layout_height=“wrap_content”,那么Android会多次调用适配器的getView方法去尝试是否能完全显示ListView的内容,从而降低系统效率
2、在MainActivity.java中写一个私有类MyAdapter,继承BaseAdapter
private class MyListAdapter extends BaseAdapter {
//一共有多少条数据需要展示
@Override
public int getCount() {
// TODO Auto-generated method stub
return 1000000;
}
//返回指定position位置对象
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
//返回position位置对应id
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
/*下面是使用ListView的一个固定写法
* 获取一个View 用来显示listview的数据,会作为listview的一个条目出现
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView tv;
/*
* convertView 是一个历史缓存对象(即在屏幕显示过,又暂时在屏幕中不显示)
* */
if(convertView == null){
//如果view对象是第一次在屏幕中显示,则创建一个新的view对象
tv = new TextView(MainActivity.this);
System.out.println("创建新的view对象----"+position);
}else{
//如果已经有同类型的view对象在屏幕显示了又暂时不再显示而作为缓存,则复用这些历史缓存对象
tv = (TextView) convertView;
System.out.println("复用历史缓存view对象----"+position);
}
tv.setText("hh"+position);
return tv;
}
}
这里是使用ListView的一个固定模板代码
3、在MainActivity.java的onCreate方法中获取ListView控件,并绑定适配器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//【1】找到Listview控件
ListView lv = (ListView) findViewById(R.id.lv);
//【2】绑定适配器
lv.setAdapter(new MyListAdapter());
}
下面是完整的MainActivity.java的代码:
package come.learn.listview;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//【1】找到Listview控件
ListView lv = (ListView) findViewById(R.id.lv);
//【2】绑定适配器
lv.setAdapter(new MyListAdapter());
}
//【3】定义listView的数据适配器
private class MyListAdapter extends BaseAdapter {
//一共有多少条数据需要展示
@Override
public int getCount() {
// TODO Auto-generated method stub
return 1000000;
}
//返回指定position位置对象
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
//返回position位置对应id
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
/*下面是使用ListView的一个固定写法
* 获取一个View 用来显示listview的数据,会作为listview的一个条目出现
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView tv;
/*
* convertView 是一个历史缓存对象(即在屏幕显示过,又暂时在屏幕中不显示)
* */
System.out.println("getView----"+position);
if(convertView == null){
//如果view对象是第一次在屏幕中显示,则创建一个新的view对象
tv = new TextView(MainActivity.this);
System.out.println("创建新的view对象----"+position);
}else{
//如果已经有同类型的view对象在屏幕显示了又暂时不再显示而作为缓存,则复用这些历史缓存对象
tv = (TextView) convertView;
System.out.println("复用历史缓存view对象----"+position);
}
tv.setText("hh"+position);
return tv;
}
}
}
我们做个测试,如果ListView在xml文件中的属性设置是layout_height=“wrap_content”,并把适配器需要展示的数据条数改为6:
<ListView
android:id="@+id/lv"
android:fastScrollEnabled="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
@Override
public int getCount() {
// TODO Auto-generated method stub
return 6;
}
显然,listview的内容是足够被完全显示出来的,所以按道理,getView方法应该只执行6次,当我们运行程序时会发现,getView方法被执行了18次:
这是因为listview的高设置的是wrap_content,导致Android无法计算listview是否能够被完成显示,从而调用多次getView方法去尝试验证。
推荐阅读
-
Mybatis入门案例中设计模式的简单分析
-
Android中的图片优化完全指南
-
Android中判断listview是否滑动到顶部和底部的实现方法
-
在Android Studio中Parcelable插件的简单使用教程
-
Android中TelephonyManager类的用法案例详解
-
Android中利用ViewHolder优化自定义Adapter的写法(必看)
-
Android中RecyclerView 滑动时图片加载的优化
-
Android 中通过ViewDragHelper实现ListView的Item的侧拉划出效果
-
解析Android中string-array数据源的简单使用
-
Android中实现GPS定位的简单例子