ListView
应该显示相当长的产品代码列表的内容(比如高达100万,即不小)。因此,有效和互动的搜索很重要。由于此处未解释的原因,过滤器值应该是URI ...
我正在使用SQLite表,以及LoadManager
和CursorLoader
方法。只要过滤器字符串发生更改,就会重置游标加载器,并依次调用onCursorLoader
。我正在使用这样的代码:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Compose the URI based on whether the content should be filtered or not.
// mCurFilter contains the filter value.
Uri uri;
if (mCurFilter.isEmpty()) {
uri = DemoContentProvider.PRODUCTS_CONTENT_URI;
} else {
uri = Uri.withAppendedPath(DemoContentProvider.PRODUCTS_CONTENT_FILTER_URI,
Uri.encode(mCurFilter));
}
String[] projection = { ProductTable.COLUMN_ID,
ProductTable.COLUMN_CODE,
ProductTable.COLUMN_NAME,
ProductTable.COLUMN_STOCK,
ProductTable.COLUMN_PRICE };
CursorLoader cursorLoader = new CursorLoader(this,
uri, projection,
null, null, // no selection and selargs - filter value inside the URI
orderInfo); // info for sorting
return cursorLoader;
}
请关注uri
构图。这里PRODUCTS_CONTENT_FILTER_URI
被定义为:
public static final Uri PRODUCTS_CONTENT_FILTER_URI =
Uri.parse("content://" + AUTHORITY
+ "/" + ProductTable.CONTENT_PATH + "/filter");
示例可能看起来像
content://cz.xxx.android.yyydemo.contentprovider/product/filter/abc
其中abc
是用户输入的过滤值。我觉得这个URI设计可能不正确(作为该领域的初学者)。对我来说,以下示例都可以:
content://AUTHORITY/product/ ... to get all products
content://AUTHORITY/product/123 ... to get the product with _id = 123
然而,像filter/value
这样的后缀是不是很好的方法?
更新:我最终会有几个相互关联的活动。请考虑客户,产品,订单头,订单列表,备注列表。我是新的类似网络的数据处理系统(即如何设计URI系统)。我想为我的URI设计规则,以便它可以是一种通用的。我知道他们只是字符串,我可以做到这一点。但我想这样做很好 :)
例如:如果客户列表变大,用户可能希望过滤该列表。我可能想表示过滤作为URI的一部分。已经的产品列表很大。我想对产品使用相同的URI结构。现在,订单将客户和产品放在一起。
说,我想显示客户和订单(订单头)的产品清单,其中包含有关订购数量的产品的信息,包括零数量的产品(可以将它们添加到命令)。这样,产品与数量的组合列表是一种类似于普通产品列表(至少列表中相同数量的项目) - 用户可能想要过滤,更改订购等。但是, URI应包含客户ID和订单ID。添加过滤后,还应将其添加到URI中。我知道我可以简单地使用类似/customer/123/order/456/filter/apple
的路径,其中apple
是过滤器值,数字123
和456
是前一部分表示的表的ID路径...
从另一个角度来看 - 对于上一个示例 - 客户ID,订单ID和过滤器值可以用作'custome'
,'order'
的键的键值对,和'filter'
分别。而且,我不知道将来会添加什么。
我想首先正确启动应用程序URI的系统。我想其他人必须做很多次。你能分享一下你的经历吗?我想避免以后重新设计它的必要性。
答案 0 :(得分:0)
如何构建它是一个方便的问题。我添加“过滤器”URI以降低查询的复杂性(例如多个“WHERE”条件,“JOIN”s)
ListView正在重用子视图,因此它可以处理很多。适配器过滤器旨在减少适配器中已有的内容。当我们谈论大数据时,我宁愿不首先加载它。