android listview 性能优化

来源:互联网 发布:csgo数据互换器是什么 编辑:程序博客网 时间:2024/05/17 03:34

       如果lisetview的数据是从数据库读取,显示的数据比较复杂,而且对数据可以实时进行增删改查操作,一般不适用于使用CursorAdapter。可以使registerContentObserverUri监听数据库的变化来刷新列表,实例代码如下,可以添加和删除数据。

public class MainActivity extends Activity implements OnClickListener {    private ArrayList<DataModel> mDataList = new ArrayList<DataModel>();    private Adapter mAdapter;    static class DataModel {        private String mName;        private int mId;        private long mDate;        public String getName() {            return mName;        }        public int getId() {            return mId;        }        public long getDate() {            return mDate;        }        public static DataModel create(int id, String name, long date) {            DataModel model = new DataModel();            model.mId = id;            model.mName = name;            model.mDate = date;            return model;        }    }    /**数据监听*/    public ContentObserver mObserver = new ContentObserver(new Handler()) {        public void onChange(boolean selfChange) {            new LoadTask().execute();        };    };    private class Adapter extends BaseAdapter {        private LayoutInflater mInflater;        private ViewHolder mViewHolder;        public Adapter() {            mInflater = LayoutInflater.from(getApplicationContext());        }        @Override        public int getCount() {            return mDataList.size();        }        @Override        public Object getItem(int position) {            return mDataList.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(final int position, View convertView, ViewGroup parent) {            if (convertView == null) {                convertView = mInflater.inflate(R.layout.list_item, null, false);                mViewHolder = new ViewHolder(convertView);                convertView.setTag(mViewHolder);            } else {                mViewHolder = (ViewHolder) convertView.getTag();            }            final DataModel model = mDataList.get(position);            mViewHolder.nameView.setText(model.getName());            mViewHolder.delBtn.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    Uri delUri = Uri.withAppendedPath(DatabaseProvider.CONTENT_URI,                            String.valueOf(model.getId()));                    getContentResolver().delete(delUri, null, null);                }            });            return convertView;        }        class ViewHolder {            TextView nameView;            Button delBtn;            ViewHolder(View v) {                nameView = (TextView) v.findViewById(R.id.name);                delBtn = (Button) v.findViewById(R.id.delBtn);            }        }    }    class LoadTask extends AsyncTask<Void, Void, Void> {        @Override        protected void onPreExecute() {            mDataList.clear();        }        @Override        protected Void doInBackground(Void... params) {            String[] columns = {                    BaseColumns._ID, DatabaseHelper.COLUMNS_NAME, DatabaseHelper.COLUMNS_DATE            };            String selection = null;            String[] selectionArgs = null;            String orderBy = DatabaseHelper.COLUMNS_DATE + " desc";            Cursor cursor = getContentResolver().query(DatabaseProvider.CONTENT_URI, columns,                    selection, selectionArgs, orderBy);            if (cursor != null && cursor.moveToFirst()) {                do {                    int id = cursor.getInt(0);                    String name = cursor.getString(1);                    long date = cursor.getLong(2);                    mDataList.add(DataModel.create(id, name, date));                } while (cursor.moveToNext());            }            if (cursor != null) {                cursor.close();            }            return null;        }        @Override        protected void onPostExecute(Void result) {            mAdapter.notifyDataSetChanged();        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ListView listView = (ListView) findViewById(R.id.list);        findViewById(R.id.add).setOnClickListener(this);        mAdapter = new Adapter();        listView.setAdapter(mAdapter);        new LoadTask().execute();    }    @Override    protected void onResume() {        super.onResume();        getContentResolver() //注册监听                .registerContentObserver(DatabaseProvider.CONTENT_URI, true, mObserver);    }    @Override    protected void onPause() {        super.onPause();        getContentResolver().unregisterContentObserver(mObserver);//取消注册    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.add:                Random random = new Random();                Integer id = random.nextInt(1000);                ContentValues values = new ContentValues();                values.put(DatabaseHelper.COLUMNS_NAME, "lise:" + id);                values.put(DatabaseHelper.COLUMNS_DATE, System.currentTimeMillis());                getContentResolver().insert(DatabaseProvider.CONTENT_URI, values);                break;        }    }}

监听数据库进行列表刷新的方式适用于以下情况:

1、该项数据的变化不依赖于该页面上的操作

因为如果该页面存在大量的数据,每次增加或删除数据都会导致数据的查询和UI的重绘,对页面的性能会有一定的影响

如果该数据不依赖于该页面上的操作,可以使用只刷新adapter的方式进行刷新,可以避免查询数据的操作,从而提高页面的响应速度,使用如下的方式进行操作:

public class MainActivity extends Activity implements OnClickListener {    private ArrayList<DataModel> mDataList = new ArrayList<DataModel>();    private Adapter mAdapter;    static class DataModel {        private String mName;        private int mId;        private long mDate;        public String getName() {            return mName;        }        public int getId() {            return mId;        }        public long getDate() {            return mDate;        }        public static DataModel create(int id, String name, long date) {            DataModel model = new DataModel();            model.mId = id;            model.mName = name;            model.mDate = date;            return model;        }    }    private class Adapter extends BaseAdapter {        private LayoutInflater mInflater;        private ViewHolder mViewHolder;        public Adapter() {            mInflater = LayoutInflater.from(getApplicationContext());        }        @Override        public int getCount() {            return mDataList.size();        }        @Override        public Object getItem(int position) {            return mDataList.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(final int position, View convertView, ViewGroup parent) {            if (convertView == null) {                convertView = mInflater.inflate(R.layout.list_item, null, false);                mViewHolder = new ViewHolder(convertView);                convertView.setTag(mViewHolder);            } else {                mViewHolder = (ViewHolder) convertView.getTag();            }            final DataModel model = mDataList.get(position);            mViewHolder.nameView.setText(model.getName());            mViewHolder.delBtn.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    Uri delUri = Uri.withAppendedPath(DatabaseProvider.CONTENT_URI,                              String.valueOf(model.getId()));                      getContentResolver().delete(delUri, null, null);                      //只刷新adapter                    mDataList.remove(position);                    mAdapter.notifyDataSetChanged();                }            });            return convertView;        }        class ViewHolder {            TextView nameView;            Button delBtn;            ViewHolder(View v) {                nameView = (TextView) v.findViewById(R.id.name);                delBtn = (Button) v.findViewById(R.id.delBtn);            }        }    }    class LoadTask extends AsyncTask<Void, Void, Void> {        @Override        protected void onPreExecute() {            mDataList.clear();        }        @Override        protected Void doInBackground(Void... params) {            String[] columns = {                    BaseColumns._ID, DatabaseHelper.COLUMNS_NAME, DatabaseHelper.COLUMNS_DATE            };            String selection = null;            String[] selectionArgs = null;            String orderBy = DatabaseHelper.COLUMNS_DATE + " desc";            Cursor cursor = getContentResolver().query(DatabaseProvider.CONTENT_URI, columns,                    selection, selectionArgs, orderBy);            if (cursor != null && cursor.moveToFirst()) {                do {                    int id = cursor.getInt(0);                    String name = cursor.getString(1);                    long date = cursor.getLong(2);                    mDataList.add(DataModel.create(id, name, date));                } while (cursor.moveToNext());            }            if (cursor != null) {                cursor.close();            }            return null;        }        @Override        protected void onPostExecute(Void result) {            mAdapter.notifyDataSetChanged();        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ListView listView = (ListView) findViewById(R.id.list);        findViewById(R.id.add).setOnClickListener(this);        mAdapter = new Adapter();        listView.setAdapter(mAdapter);        new LoadTask().execute();    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.add:                Random random = new Random();                Integer id = random.nextInt(1000);                ContentValues values = new ContentValues();                String name = "lise:" + id;                long date = System.currentTimeMillis();                values.put(DatabaseHelper.COLUMNS_NAME, name);                values.put(DatabaseHelper.COLUMNS_DATE, date);                getContentResolver().insert(DatabaseProvider.CONTENT_URI, values);                //只刷新adapter                mDataList.add(DataModel.create(0, name, date));                mAdapter.notifyDataSetChanged();                break;        }    }}


原创粉丝点击