Как стать автором
Обновить

Комментарии 26

В getView() используется:
mRowIds.moveToPosition(position); long rowId = mRowIds.getLong(0); Cursor cursor = mDataSource.getRowById(rowId); cursor.moveToFirst();

А должен getItem().
Ну и получать rowId надо через getItemId, а еще надо проверять на null.
да, вы правы. я хотел в первую очередь продемонстрировать идею
CursorAdapter бегает по курсору и берёт из него данные. Мой адаптер бегает по курсору с одним только первичным ключом, и перезапрашивает базу по первичному ключу. CursorAdapter заметено тормозит при быстром скроле, а мой — нет. Не поленитесь, накидайте пример и сами попробуйте.
Так у вас сравнения нет. Вот если бы вы показали, что ваша реализация быстрее в тестах на n-секунд, то другое дело.
если бы прочли статью… а впрочем ладно, подскажите методологию измерения задержек в ui?
Время между получением и отображением.
А вообще, зачем вы в Cursor храните > 500 значений? Насколько я помню, то CursorAdapter умеет работать с limit.
я всё-таки настоятельно рекомендую вам прочитать статью
Я ее прочитал.
Проблему надо показать, а потом представить ее решение.
Проблема в том, что CursorAdapter тормозит при вызове Cursor.getCount.
нет. даже если вы переопределите его, скажем так

		@Override
		public int getCount() {
			return 50000;
		}


то ListView всё равно будет притормаживать при быстром скроле
Интересно, а как по скорости будет работать OrmLite?
Там используется обычный List
Кстати, а это вы разрабатывали Pravo.ru? Там пока не очень быстро все работает :)
да, мы там это ещё не внедрили
сори, эти вопросы вне моей компетенции
Я понимаю. Надеюсь на обновление топика по производительности.
Прошу.
Для CursorAdapter максимальная задержка вызова метода getView составила 553 мс, для QuickAdapter — 47 мс.
Так это в топик надо, вместе с тем, как замерялось :)
А получается хорошо, почти в 10 раз, надо будет самому проверить, как время появится.
скажите, а это ваша принципиальная позиция — не читать статью, к которой вы пишите комментарии?
Пока не обновил страницу — вывода не было.
А зачем в ListView отображать «50 тысяч, 100 тысяч и более строк»? Мне кажется тут проблема в логике, а не в производительности ListView
в этой статье я ставил целью ответить на вопрос «что делать?», а не «кто виноват?» :)
Могли бы вы выложить небольшой готовый пример, пожалуйста
ну вроде там и так всё ясно, но если вы просите

Активити

package me.ilich.hellodocumentview;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;

public class QuickMainActivity extends Activity {

	ListView mListView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list);
		mListView = (ListView) findViewById(R.id.list);
		final QuickAdapter a = new MyQuickAdapter(this, new MyDataSource());
		mListView.setAdapter(a);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
	
	class MyQuickAdapter extends QuickAdapter {

		public MyQuickAdapter(Context context, DataSource dataSource) {
			super(context, dataSource);
		}
		
		@Override
		public View getView(int arg0, View arg1, ViewGroup arg2) {
			long t1 = System.currentTimeMillis();
			View result = super.getView(arg0, arg1, arg2);
			long t2 = System.currentTimeMillis();
			long dt = t2-t1;
			if(dt>10){
				Log.i("Sokolov", arg0 + " " + dt);
			}
			return result;
		}

		@Override
		public View newView(Context context, Cursor cursor, ViewGroup parent) {
			View view = getLayoutInflater().inflate(
					android.R.layout.simple_list_item_1, null);
			ViewHolder vh = new ViewHolder();
			vh.tv = (TextView) view.findViewById(android.R.id.text1);
			view.setTag(vh);
			return view;
		}

		@Override
		public void bindView(View view, Context context, Cursor cursor) {
			ViewHolder vh = (ViewHolder) view.getTag();
			if(vh!=null){
				vh.tv.setText(cursor.getString(cursor.getColumnIndex("text1")));
			}
		}
		
		class ViewHolder {
			TextView tv;
		}
		
	}
	
	class MyDataSource implements QuickAdapter.DataSource {

		@Override
		public Cursor getRowIds() {
			return ((HelloDocumentView) getApplication()).mDatabase.rawQuery(
					"SELECT rowid FROM table1", new String[]{});
		}

		@Override
		public Cursor getRowById(long rowId) {
			return ((HelloDocumentView)getApplication()).mDatabase.rawQuery("SELECT * FROM table1 WHERE rowid = ?", new String[]{Long.toString(rowId)});
		}
		
	}

}


Аппликейшен

package me.ilich.hellodocumentview;

import android.app.Application;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

public class HelloDocumentView extends Application {
	
	public SQLiteDatabase mDatabase;
	
	@Override
	public void onCreate() {
		super.onCreate();
		mDatabase = openOrCreateDatabase("/mnt/sdcard/db.sqlite", Context.MODE_PRIVATE, null);
	}

}


Вам остаётся только создать базу db.sqlite с таблицей table1. Достаточно наглядно?
Да, премного благодарен!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации