Android中Listview的优化方法

1.最普通的一种优化,创建一个适配器类使用getView()方法,声明一个View对象,用inflate一个view出来,通过findViewById()得到TextView,重复使用view对象和findViewById()的方法。

private class MyAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return list_infor.size();
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {
        View view;
        view = View.inflate(MainActivity.this, R.layout.activity_item, null);
        TextView tv_item1=(TextView)view.findViewById(R.id.t1);
        TextView tv_item2=(TextView)view.findViewById(R.id.t2);
        TextView tv_item3=(TextView)view.findViewById(R.id.t3);
        tv_item1.setText(String.valueOf(list_infor.get(i).getId()));
        tv_item2.setText(list_infor.get(i).getName());
        tv_item3.setText(list_infor.get(i).getNumber());

     return view;
    }
}

2.优化二

上面的写法没有实现重复使用View对象和findViewById()的方法,此次优化后,只保留能够显示的最大个数的View对象的个数,新的view通过复用的方式使用消失的条目,使用getView()方法中提供的convertView复用view,当convertView==null时,通过inflate一个view出来。

private class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return list_infor.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            View view;
            if(convertView==null) {
                view = View.inflate(MainActivity.this, R.layout.activity_item, null);
            }else{
                view=convertView;
            }
           TextView tv_item1=(TextView)view.findViewById(R.id.t1);
            TextView tv_item2=(TextView)view.findViewById(R.id.t2);
            TextView tv_item3=(TextView)view.findViewById(R.id.t3);
            tv_item1.setText(String.valueOf(list_infor.get(i).getId()));
            tv_item2.setText(list_infor.get(i).getName());
            tv_item3.setText(list_infor.get(i).getNumber());

            return view;
        }

    }

 3.优化三

 通过上面的写法实现重复使用View对象,但没有解决view组件中的TextView,每次使用都要去xml文件中查找id的问题,此次优化后,可以实现让View中所包含的组件随着view的使用而使用。要创建一个静态内部类,类中的成员变量应与view中所包含的组件的类型个数相同。

private static class ViewHolder{
        private TextView tvHolder;
        private TextView tvHolder1;
        private TextView tvHolder2;
    }
private class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return list_infor.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            tv_item3.setText(list_infor.get(i).getNumber());
            View view;
            ViewHolder holder;

            if(convertView==null) {
                view = View.inflate(MainActivity.this, R.layout.activity_item, null);
                holder=new ViewHolder();
                holder.tvHolder=(TextView)view.findViewById(R.id.t1);
                holder.tvHolder1=(TextView)view.findViewById(R.id.t2);
                holder.tvHolder2=(TextView)view.findViewById(R.id.t3);
                view.setTag(holder);

            }else{
                view=convertView;
                holder=(ViewHolder)view.getTag();
            }

          holder.tvHolder.setText(String.valueOf(list_infor.get(i).getId()));
            holder.tvHolder1.setText(list_infor.get(i).getName());
            holder.tvHolder2.setText(list_infor.get(i).getNumber());
            return view;
        }

    }

注意:

1.根据保存在业务Bean中的属性,来确定View中组件TextView的个数。

2.使用此方法要新建一个布局文件,根据需要设计布局文件。

原文地址:https://www.cnblogs.com/sunrise-hs/p/5679144.html