在 Android,如何从领域列表构建领域适配器?
On Android, how can I build a Realm Adapter from a Realm List?
我正在使用 Realm 在 Android 上编写食谱应用程序。我在每个食谱 object 中都有一个 Ingredient 类型的 RealmList。 object 创建代码工作正常。
现在我正在为显示单个食谱的片段编写代码。我能够为所有食谱标题列表创建一个领域适配器,因为我使用如下查询构建了该列表:
public class RecipeTitleAdapter extends RealmBaseAdapter<RecipeTitle> implements ListAdapter {
public RecipeTitleAdapter(Context context, int resId,
RealmResults<RecipeTitle> realmResults,
boolean automaticUpdate) {
...
recipeTitles = RecipeTitle.returnAllRecipeTitles(realm);
final RecipeTitleAdapter adapter = new RecipeTitleAdapter(RecipeParserApplication.appContext, R.id.recipe_list_view, recipeTitles, true);
但是现在我正在查看单个食谱的配料,我有一个 RealmList of Ingredients 而不是 RealmResults object。我的配料适配器 class 与食谱标题适配器具有相同类型的构造函数,所以我想知道如何(或什至)我可以从 RealmList 开始工作。
public class IngredientAdapter extends RealmBaseAdapter<Ingredient> implements ListAdapter {
private static class ViewHolder {
TextView quantity;
TextView unitOfMeasure;
TextView ingredientItemName;
TextView processingInstructions;
}
public IngredientAdapter(Context context, int resId,
RealmResults<Ingredient> realmResults,
boolean automaticUpdate) {
....
final IngredientAdapter adapter = new IngredientAdapter(RecipeParserApplication.appContext, R.id.ingredientListView, recipe.getIngredients(), true);
public RealmList<Ingredient> getIngredients() {
return ingredients;
}
由于recipe.getIngredients returns 一个RealmList,分配IngredientAdapter 的行returns 编译错误:
错误:(63, 43) 错误:class IngredientAdapter 中的构造函数 IngredientAdapter 无法应用于给定类型;
必需:上下文、int、RealmResults、布尔值
找到:上下文、int、RealmList、布尔值
原因:实参RealmList无法通过方法调用转换为RealmResults
RealmList 的行为类似于普通数组,因此如果您无法进行与您想要显示的内容相匹配的查询,您可以使用任何普通适配器,例如一个数组适配器。使用 RealmBaseAdapter 的唯一优点是它会自动刷新,但这很容易自己完成:
// Pseudo code
ArrayAdapter adapter;
RealmChangeListener listener = new RealmChangeListener() {
public void onChange() {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}
protected void onCreate(Bundle savedInstanceState) {
// ...
realm.addChangeListener(listener);
RealmList data = getRealmListData();
adapter = new ArrayAdapter(data);
listView.setAdapter(adapter);
}
我正在使用 Realm 在 Android 上编写食谱应用程序。我在每个食谱 object 中都有一个 Ingredient 类型的 RealmList。 object 创建代码工作正常。
现在我正在为显示单个食谱的片段编写代码。我能够为所有食谱标题列表创建一个领域适配器,因为我使用如下查询构建了该列表:
public class RecipeTitleAdapter extends RealmBaseAdapter<RecipeTitle> implements ListAdapter {
public RecipeTitleAdapter(Context context, int resId,
RealmResults<RecipeTitle> realmResults,
boolean automaticUpdate) {
...
recipeTitles = RecipeTitle.returnAllRecipeTitles(realm);
final RecipeTitleAdapter adapter = new RecipeTitleAdapter(RecipeParserApplication.appContext, R.id.recipe_list_view, recipeTitles, true);
但是现在我正在查看单个食谱的配料,我有一个 RealmList of Ingredients 而不是 RealmResults object。我的配料适配器 class 与食谱标题适配器具有相同类型的构造函数,所以我想知道如何(或什至)我可以从 RealmList 开始工作。
public class IngredientAdapter extends RealmBaseAdapter<Ingredient> implements ListAdapter {
private static class ViewHolder {
TextView quantity;
TextView unitOfMeasure;
TextView ingredientItemName;
TextView processingInstructions;
}
public IngredientAdapter(Context context, int resId,
RealmResults<Ingredient> realmResults,
boolean automaticUpdate) {
....
final IngredientAdapter adapter = new IngredientAdapter(RecipeParserApplication.appContext, R.id.ingredientListView, recipe.getIngredients(), true);
public RealmList<Ingredient> getIngredients() {
return ingredients;
}
由于recipe.getIngredients returns 一个RealmList,分配IngredientAdapter 的行returns 编译错误:
错误:(63, 43) 错误:class IngredientAdapter 中的构造函数 IngredientAdapter 无法应用于给定类型; 必需:上下文、int、RealmResults、布尔值 找到:上下文、int、RealmList、布尔值 原因:实参RealmList无法通过方法调用转换为RealmResults
RealmList 的行为类似于普通数组,因此如果您无法进行与您想要显示的内容相匹配的查询,您可以使用任何普通适配器,例如一个数组适配器。使用 RealmBaseAdapter 的唯一优点是它会自动刷新,但这很容易自己完成:
// Pseudo code
ArrayAdapter adapter;
RealmChangeListener listener = new RealmChangeListener() {
public void onChange() {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
}
protected void onCreate(Bundle savedInstanceState) {
// ...
realm.addChangeListener(listener);
RealmList data = getRealmListData();
adapter = new ArrayAdapter(data);
listView.setAdapter(adapter);
}