gpt4 book ai didi

android - Couchbase Lite Android - 以内存友好的方式填充 ListView

转载 作者:太空狗 更新时间:2023-10-29 15:05:38 26 4
gpt4 key购买 nike

我习惯在 Android 中使用 Loader 和 CursorAdapter。查看适用于 Android 的 Couchbase-Lite,我无法轻易地找到一种方法来填充 ListView,我认为这是一种内存友好的方式。

在此处查看其示例应用程序中的代码: https://github.com/couchbaselabs/GrocerySync-Android/blob/master/GrocerySync-Android/src/main/java/com/couchbase/grocerysync/MainActivity.java

protected void startCBLite() throws Exception {
manager = new Manager(getApplicationContext().getFilesDir(), Manager.DEFAULT_OPTIONS);
//install a view definition needed by the application
database = manager.getDatabase(DATABASE_NAME);
com.couchbase.lite.View viewItemsByDate = database.getView(String.format("%s/%s", designDocName, byDateViewName));
viewItemsByDate.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
Object createdAt = document.get("created_at");
if (createdAt != null) {
emitter.emit(createdAt.toString(), null);
}
}
}, "1.0");


startLiveQuery(viewItemsByDate);

startSync();

}

private void startSync() {

URL syncUrl;
try {
syncUrl = new URL(SYNC_URL);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}

Replication pullReplication = database.createPullReplication(syncUrl);
pullReplication.setContinuous(true);

Replication pushReplication = database.createPushReplication(syncUrl);
pushReplication.setContinuous(true);

pullReplication.start();
pushReplication.start();

pullReplication.addChangeListener(this);
pushReplication.addChangeListener(this);

}

private void startLiveQuery(com.couchbase.lite.View view) throws Exception {

final ProgressDialog progressDialog = showLoadingSpinner();

if (liveQuery == null) {

liveQuery = view.createQuery().toLiveQuery();

liveQuery.addChangeListener(new LiveQuery.ChangeListener() {
@Override
public void changed(LiveQuery.ChangeEvent event) {
displayRows(event.getRows());
runOnUiThread(new Runnable() {
@Override
public void run() {
progressDialog.dismiss();
}
});
}
});

liveQuery.start();

}

}

private void displayRows(QueryEnumerator queryEnumerator) {

final List<QueryRow> rows = getRowsFromQueryEnumerator(queryEnumerator);

runOnUiThread(new Runnable() {
@Override
public void run() {

itemListViewAdapter = new GrocerySyncListAdapter(
getApplicationContext(),
R.layout.grocery_list_item,
R.id.label,
rows
);
itemListView.setAdapter(itemListViewAdapter);
itemListView.setOnItemClickListener(MainActivity.this);
itemListView.setOnItemLongClickListener(MainActivity.this);

}
});
}


private List<QueryRow> getRowsFromQueryEnumerator(QueryEnumerator queryEnumerator) {
List<QueryRow> rows = new ArrayList<QueryRow>();
for (Iterator<QueryRow> it = queryEnumerator; it.hasNext();) {
QueryRow row = it.next();
rows.add(row);
}
return rows;
}

这里: https://github.com/couchbaselabs/GrocerySync-Android/blob/master/GrocerySync-Android/src/main/java/com/couchbase/grocerysync/GrocerySyncListAdapter.java

@Override
public View getView(int position, View itemView, ViewGroup parent) {
...
QueryRow row = list.get(position);
Document document = row.getDocument();
...
}

查询返回一个枚举器,然后循环创建 ArrayList,然后将其传递给查询适配器。这都是在 UI 线程上完成的。

对于一个简单的杂货店应用程序演示来说,这可能没问题,但是如果我的数据库中有 20,000 个文档,并且有 18,000 个返回响应我的查询呢?

最佳答案

查看 TodoLite Android 示例项目。在那里检查 TaskAdapter。通过直接在 BaseAdapter 中使用 queryEnumertor 来处理这种情况下面是包含 TaskAdapter 类的 MainActivity 的链接

https://github.com/couchbaselabs/ToDoLite-Android/blob/master/ToDoLite/src/main/java/com/couchbase/todolite/MainActivity.java

关于android - Couchbase Lite Android - 以内存友好的方式填充 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com