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; } }}
- android ListView 性能优化
- Android ListView性能优化
- android listview 性能优化
- Android ListView性能优化
- Android Listview 性能优化
- android:listview性能优化
- android ListView性能优化提示
- Android之ListView性能优化
- android listview gridview 性能优化
- Android之ListView性能优化
- android ListView适配器性能优化
- Android之ListView性能优化
- Android之ListView性能优化
- Android listview的性能优化
- android性能优化学习笔记-listview优化
- Android性能优化--listview 优化机制
- Android性能优化--listview 优化机制
- [Android]ListView性能优化之视图缓存
- SVN安装配置与使用
- eclipse连接sql server 2012
- jquery库与其他库冲突的问题解决-jquery.noConflict()
- 正则表达式概述与JAVA中正则表达式的应用
- SQL中的五种数据类型
- android listview 性能优化
- iphone之不同设备开发注意事项
- ndk中依赖两个静态库的应用
- 加入价格战,亚马逊中国开始发力
- awk文本处理总结(入门,中级,高级)
- LTE-TDD/FDD 物理层
- 最低松弛度优先调度算法
- 关于“高校现代教学管理系统漏洞”的攻击与防范
- 黑马程序员——java基础小结