ListView详解(ConvertView优化)

来源:互联网 发布:linux如何安装迅雷 编辑:程序博客网 时间:2024/05/18 03:41

概念:ListView在andoid应用中很常见,用于显示列表,    一个列表表示一行,显示自定义的View,继承baseAdapter ,这点很重要...ListView的每个条目都是一个View;

MVC概念: 在此案例中    , 模型层  moder  就是集合List对象,用户查看想要数据的集合  视图层  View    ListView  ,如何显示,显示什么        , 控制层  control   ,就是Adapter

Adapter:ListView的Adapter最重要的Adapter是baseAdapter ,覆盖里面两个方法很重要,见代码;

优化:BaseAdapter内部的,getView方法每次在用户上下滑动的时候,position的值在变化,getView每次在滑动到下一个出现的条目或者上一个出现的条目(界面显示不出来的条目)的时候都会调用getView(),这样很浪费存储空间,稍有不足就会崩,因此,特有缓存参数  convertView,每次显示出来的View都会存入缓存...

         getView(publicView getView(intposition, View convertView, ViewGroup parent) {

      

             People p=listArray.get(position);                    /*                      一、 先获取填充器对象                      LayoutInflater inflater=LayoutInflater.from(MainActivity.this);                     再用布局填充器对象去填充                     View vi= inflater.inflate(R.layout.layout_textview,null);                      二、获取填充器对象                       LayoutInflater inflater=getLayoutInflater();                       再用布局填充器去填充                     View vi=infater。inflate(R。layout。layout_textview,null)                          */                 //直接用View将布局文件填充为View ,都是inflate,有好几种实现方法,见上表       View vi=null;
    //如果缓存为空,则加载每个条目的View    if(convertView==null){        vi = View.inflate(MainActivity.this, R.layout.layout_textview, null);    }else{
         //如果缓存已有,那么加载缓存的条目就可,不用再重构View        vi=convertView;    }    TextView tv_name= (TextView) vi.findViewById(R.id.tv_name);    tv_name.setText(p.getName());    //如果没有vi,那么系统提示是找不到TextView的,系统如果通过findViewById()只会找到主界面的    //id ,如何找到所需布局的id,需要将布局文件填充成View,注意此处    TextView tv_salary= (TextView) vi.findViewById(R.id.tv_salary);    tv_salary.setText(p.getSalary());    TextView tv_phone= (TextView) vi.findViewById(R.id.tv_phone);    tv_phone.setText(p.getPhone());     return vi;}

}



public class MainActivity extends AppCompatActivity {    List<People> listArray=null;    MyOpenDatabase my_db=new MyOpenDatabase(this,"people",null,1);    ListView listView=null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        SQLiteDatabase sd=my_db.getWritableDatabase();        listArray=new ArrayList<People>();        Cursor cursor=sd.query("people", null, null, null, null, null, null, null);        while(cursor.moveToNext()){            String name=cursor.getString(cursor.getColumnIndex("name"));            String salary=cursor.getString(cursor.getColumnIndex("salary"));            String phone=cursor.getString(cursor.getColumnIndex("phone"));            People people=new People(name,salary,phone);            listArray.add(people);        }        listView= (ListView) findViewById(R.id.list_item);        listView.setAdapter(new MyAdapter());    }    class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return listArray.size();        }        @Override        public Object getItem(int position) {            return null;        }        @Override        public long getItemId(int position) {            return 0;        }        @Override        //获取一个View对象作为ListView的条目,这个View可以是buton,text,EditText,所有View的子类都可以作为ListView的条目来显示,这样就很华丽了
       //getCount()返回的数值即为getView调用的次数,position的值为显示条目的位置,第0个View,position为0,第2个View,position为1;
        //position为1...        public View getView(int position, View convertView, ViewGroup parent) {            TextView textView = new TextView(MainActivity.this);            People p = listArray.get(position);            textView.setText(p.toString());            return textView;        }    }}

0 0