Comments 26
В getView() используется:
А должен getItem().
mRowIds.moveToPosition(position);
long rowId = mRowIds.getLong(0);
Cursor cursor = mDataSource.getRowById(rowId);
cursor.moveToFirst();
А должен getItem().
0
Ну и получать rowId надо через getItemId, а еще надо проверять на null.
0
да, вы правы. я хотел в первую очередь продемонстрировать идею
+3
Честно, я пока не вижу идеи, чем ваша идея отличается от developer.android.com/reference/android/widget/CursorAdapter.html?
0
CursorAdapter бегает по курсору и берёт из него данные. Мой адаптер бегает по курсору с одним только первичным ключом, и перезапрашивает базу по первичному ключу. CursorAdapter заметено тормозит при быстром скроле, а мой — нет. Не поленитесь, накидайте пример и сами попробуйте.
+7
Так у вас сравнения нет. Вот если бы вы показали, что ваша реализация быстрее в тестах на n-секунд, то другое дело.
-5
если бы прочли статью… а впрочем ладно, подскажите методологию измерения задержек в ui?
+3
Время между получением и отображением.
А вообще, зачем вы в Cursor храните > 500 значений? Насколько я помню, то CursorAdapter умеет работать с limit.
А вообще, зачем вы в Cursor храните > 500 значений? Насколько я помню, то CursorAdapter умеет работать с limit.
-6
я всё-таки настоятельно рекомендую вам прочитать статью
+8
Я ее прочитал.
Проблему надо показать, а потом представить ее решение.
Проблема в том, что CursorAdapter тормозит при вызове Cursor.getCount.
Проблему надо показать, а потом представить ее решение.
Проблема в том, что CursorAdapter тормозит при вызове Cursor.getCount.
-5
Интересно, а как по скорости будет работать OrmLite?
Там используется обычный List
Там используется обычный List
0
Кстати, а это вы разрабатывали Pravo.ru? Там пока не очень быстро все работает :)
0
да, мы там это ещё не внедрили
0
Было бы круто показать на цифрах во сколько раз быстрее.
Как насчет того, что бы ответить на habrahabr.ru/company/turbomilk/blog/149955/#comment_5076397?
Как насчет того, что бы ответить на habrahabr.ru/company/turbomilk/blog/149955/#comment_5076397?
0
сори, эти вопросы вне моей компетенции
0
Я понимаю. Надеюсь на обновление топика по производительности.
0
А зачем в ListView отображать «50 тысяч, 100 тысяч и более строк»? Мне кажется тут проблема в логике, а не в производительности ListView
+2
Могли бы вы выложить небольшой готовый пример, пожалуйста
0
ну вроде там и так всё ясно, но если вы просите
Активити
Аппликейшен
Вам остаётся только создать базу db.sqlite с таблицей table1. Достаточно наглядно?
Активити
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. Достаточно наглядно?
+3
Only those users with full accounts are able to leave comments. Log in, please.
Маленькая хитрость для отображения большого объёма данных в ListView