这是我的问题:
我需要在RecyclerView中显示一些项目,其顺序与从服务器调用它们以匹配给定的设计。但是,我想我可能会遗漏一些关于Java实际工作的非常明显的事情,因为即使我的调用是按顺序完成的,我也注意到它们之后的代码是在从服务器获得结果之前执行的,之后,更新UI时,显示的项目顺序与最初预期的顺序不同。
这就是我生命中的某些日子已被带走的代码片段。
getGetMetricRangeAPI("bp_dia");
getGetMetricRangeAPI("bp_sys");
getGetMetricRangeAPI("glucose");
getGetMetricRangeAPI("lung_fev1");
getGetMetricRangeAPI("vo2");
getGetMetricRangeAPI("visceral");
getGetMetricRangeAPI("body_fat");
mGoalsRecyclerView.setAdapter(mGoalsAdapter);
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 2);
mGoalsRecyclerView.setLayoutManager(layoutManager);
mGoalsRecyclerView.setNestedScrollingEnabled(false);
// mGoalsList is returning empty, as it should update *after* the
// response from the server, but for some reason, and that's what is
// confusing me a lot at the moment, that part of the code is read
// before it, so this whole for loop is being ignored at the moment.
for (GetAdvancedGoal goal : mGoalsList) {
mGoalsAdapter.addItem(goal);
}
对此的任何帮助都非常感谢!!非常感谢!!! :)
Ps:我认为我的问题的另一个标题可能是:
如何确保在Java中按顺序执行操作?
好像我可以确保我可以填充我的适配器仅当 mGoalsList数组被完全填充时(甚至是散列图,根据建议),我可以根据需要订购和显示项目序列
非常感谢你的帮助!
答案 0 :(得分:1)
getGetMetricRangeAPI("bp_dia",1);
getGetMetricRangeAPI("bp_sys",2);
getGetMetricRangeAPI("glucose",3);
getGetMetricRangeAPI("lung_fev1",4);
getGetMetricRangeAPI("vo2",5);
getGetMetricRangeAPI("visceral",6);
getGetMetricRangeAPI("body_fat",7);
为API调用添加一个整数。将响应保存在HashMap中并根据此顺序对其进行排序
答案 1 :(得分:1)
您同时有多个API调用,所有这些之间必须存在依赖关系。对于根据api调用的列表排序,可以使用分配给每个api调用的编号,并使用数字创建返回结果的hashmap,并且可以根据数字显示列表。但我认为这是最糟糕的主意。
对于更好和纯粹的解决方案,如果是核心开发人员。你必须去RxJava,你必须听到这个。这是描述链接: RxJava
在RxJava中,您定义了调用api之间的依赖关系,在这里您可以定义观察者和观察者。 Observer总是听可观察的(抱歉在链接中找到详细说明),所以你必须确保这一点。第4次api应该在第2次或第3次之后调用。去吧,对不起,我现在没有任何相关的代码。如果我能得到那将发布在这里。
答案 2 :(得分:0)
for (GetAdvancedGoal goal : mGoalsList) {
mGoalsAdapter.addItem(goal);
}
//this is missing in your code
mGoalsAdapter.notifyDataSetChanged()
答案 3 :(得分:0)
那是解决我的问题的hashmap建议的实现
在我的片段
上添加了@Ammer的答案getGetMetricRangeAPI("bp_dia",1);
getGetMetricRangeAPI("bp_sys",2);
getGetMetricRangeAPI("glucose",3);
getGetMetricRangeAPI("lung_fev1",4);
getGetMetricRangeAPI("vo2",5);
getGetMetricRangeAPI("visceral",6);
getGetMetricRangeAPI("body_fat",7);
这是我的适配器使用hashmap而不是arraylist
public void addItem(final GetAdvancedGoal item, int position) {
if (position == 0) {
mHashMap.put(item, 0);
mHashMapInvertedKeyValue.put(0, item);
} else if (position == 1) {
mHashMap.put(item, 1);
mHashMapInvertedKeyValue.put(1, item);
} else if (position == 2) {
mHashMap.put(item, 2);
mHashMapInvertedKeyValue.put(2, item);
} else if (position == 3) {
mHashMap.put(item, 3);
mHashMapInvertedKeyValue.put(3, item);
} else if (position == 4) {
mHashMap.put(item, 4);
mHashMapInvertedKeyValue.put(4, item);
} else if (position == 5) {
mHashMap.put(item, 5);
mHashMapInvertedKeyValue.put(5, item);
}
notifyDataSetChanged();
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
GetAdvancedGoal getAdvancedGoal = null;
if (mHashMapInvertedKeyValue.get(position) != null) {
getAdvancedGoal = mHashMapInvertedKeyValue.get(position);
// Name
holder.update_goal_editText.setText(getAdvancedGoal.getValue());
// Image
int id = getAdvancedGoal.getImageID();
switch (id) {
case R.drawable.blood_pressure:
SharedPreferences preferences = mActivity.getSharedPreferences("ADVANCED_METRIC_BP_SYS", Context.MODE_PRIVATE);
String valueSys = preferences.getString("bp_sys", "");
holder.update_goal_editText.setText(getAdvancedGoal.getValue() + "/" + valueSys);
holder.goal_image.setImageResource(R.drawable.blood_pressure);
break;
case R.drawable.glucose_level:
holder.goal_image.setImageResource(R.drawable.glucose_level);
break;
case R.drawable.visceral_fat:
holder.goal_image.setImageResource(R.drawable.visceral_fat);
break;
case R.drawable.lung_function:
holder.goal_image.setImageResource(R.drawable.lung_function);
break;
case R.drawable.v02_max:
holder.goal_image.setImageResource(R.drawable.v02_max);
break;
case R.drawable.body_fat:
holder.goal_image.setImageResource(R.drawable.body_fat);
break;
}
}
}