如何以与API调用相同的顺序加载RecyclerView中的项目?

时间:2017-11-22 12:27:01

标签: java android android-recyclerview

这是我的问题

我需要在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数组被完全填充时(甚至是散列图,根据建议),我可以根据需要订购和显示项目序列

非常感谢你的帮助!

4 个答案:

答案 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;

        }

    }


}