android listview 性能优化

       如果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;
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值