在同时进行改造时,遇到问题2呼叫按预期并行工作

时间:2018-04-12 06:58:38

标签: android android-recyclerview retrofit retrofit2

我的mainftivity中有2个微调器和1个RecyclerView,我希望在启动时使用改装填充。在我的主要片段onViewCreated()中,我执行了这两个调用(fetchDistricts()fetchPremiumStudios()),但是当spinner(fetchDistricts)填充正确时,recyclerview仍为空(fetchPremiumStudios)。

当我评论fetchDistricts()单独填充Recyclerview时,它可以正常工作,但当我这两个时候,recyclelerview都是空的。

我使用调试器来查找调用时检索到的Studio对象,但由于某种原因,列表的大小仍为0,这真的很奇怪。请帮忙!

public class MainFragment extends Fragment {
@Inject
Retrofit retrofit;

private Api api;
private List<District> districtList;
private List<Taluk> talukList;
private List<Studio> studioList;
private AppCompatActivity activity;
private ArrayAdapter<District> districtAdapter;
private ArrayAdapter<Taluk> talukAdapter;
private StudioAdapter studioAdapter;
private MainInterface mainInterface;
private View rootView;
private boolean hasInitializedRootView = false;

interface MainInterface {
    void loadFragment(Fragment fragment);
}

@BindView(R.id.spinner_main_district)
Spinner spinnerDistrict;

@BindView(R.id.spinner_main_taluk)
Spinner spinnerTaluk;

@BindView(R.id.rv_main_channel)
RecyclerView rvStudio;

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (rootView == null) {
        rootView = inflater.inflate(R.layout.fragment_main, container, false);
    } else {

        container.removeView(rootView);
    }
    return rootView;

}

@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if (!hasInitializedRootView) {
        hasInitializedRootView = true;

        doInitialSetUpOfUI();
    }
}

private void doInitialSetUpOfUI() {

    ButterKnife.bind(this, rootView);
    MyApplication.getApp().getNetworkComponent().inject(this);
    api = retrofit.create(Api.class);

    districtList = new ArrayList<>();
    districtAdapter = new ArrayAdapter<>(activity, android.R.layout.simple_list_item_1, districtList);
    districtAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerDistrict.setAdapter(new NothingSelectedSpinnerAdapter(
            districtAdapter,
            R.layout.district_spinner_row_nothing_selected,
            // R.layout.contact_spinner_nothing_selected_dropdown, // Optional
            activity));

    spinnerDistrict.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
            talukList.clear();
            talukAdapter.notifyDataSetChanged();
            studioList.clear();
            studioAdapter.notifyDataSetChanged();
            if (position != 0) {
                District selectedDistrict = districtList.get(position - 1);
                fetchTaluks(selectedDistrict.getId());
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

    talukList = new ArrayList<>();
    talukAdapter = new ArrayAdapter<>(activity, android.R.layout.simple_list_item_1, talukList);
    talukAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerTaluk.setAdapter(new NothingSelectedSpinnerAdapter(
            talukAdapter,
            R.layout.taluk_spinner_row_nothing_selected,
            // R.layout.contact_spinner_nothing_selected_dropdown, // Optional
            activity));

    spinnerTaluk.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
            studioList.clear();
            studioAdapter.notifyDataSetChanged();
            if (position != 0) {
                Taluk selectedTaluk = talukList.get(position - 1);
                fetchStudios(selectedTaluk.getId());
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });

    View.OnClickListener onClickChannelListener =
            view -> {

                int position = (int) view.getTag();
                Studio studio = studioList.get(position);

                Fragment fragment = new StudioDetailsFragment();
                Bundle bundle = new Bundle();
                bundle.putString("studio_id", studio.getId());
                fragment.setArguments(bundle);
                mainInterface.loadFragment(fragment);
            };

    studioList = new ArrayList<>();
    rvStudio.setHasFixedSize(true);
    RecyclerView.LayoutManager channelLayoutManager = new GridLayoutManager(activity, 2);
    rvStudio.setLayoutManager(channelLayoutManager);
    studioAdapter = new StudioAdapter(studioList, activity, onClickChannelListener);
    rvStudio.setAdapter(studioAdapter);

    fetchPremiumStudios();
    fetchDistricts();
}

private void fetchPremiumStudios() {

    Call<StudioResponse> call = api.getPremiumStudios();
    call.enqueue(new Callback<StudioResponse>() {

        @Override
        public void onResponse(@NonNull Call<StudioResponse> call, @NonNull Response<StudioResponse> response) {
            StudioResponse studioResponse = response.body();

            if (Objects.requireNonNull(studioResponse).getStatus().equals(getString(R.string.http_ok))) {

                studioList.addAll(studioResponse.getStudios());
                studioAdapter.notifyDataSetChanged();

            } else {

                Toast.makeText(activity, studioResponse.getMessage(), Toast.LENGTH_LONG).show();
            }

        }

        @Override
        public void onFailure(@NonNull Call<StudioResponse> call, @NonNull Throwable t) {
            Toast.makeText(activity, R.string.check_internet, Toast.LENGTH_LONG).show();
        }
    });

}

private void fetchStudios(String talukId) {

    studioList.clear();

    Call<StudioResponse> call = api.getStudios(talukId);
    call.enqueue(new Callback<StudioResponse>() {
        @Override
        public void onResponse(@NonNull Call<StudioResponse> call, @NonNull Response<StudioResponse> response) {
            StudioResponse studioResponse = response.body();

            if (Objects.requireNonNull(studioResponse).getStatus().equals(getString(R.string.http_ok))) {

                studioList.addAll(studioResponse.getStudios());
                studioAdapter.notifyDataSetChanged();

            } else {
                Toast.makeText(activity, studioResponse.getMessage(), Toast.LENGTH_LONG).show();
            }

        }

        @Override
        public void onFailure(@NonNull Call<StudioResponse> call, @NonNull Throwable t) {
            Toast.makeText(activity, R.string.check_internet, Toast.LENGTH_LONG).show();
        }
    });
}


private void fetchTaluks(String districtId) {

    talukList.clear();

    Call<TalukResponse> call = api.getTaluks(districtId);
    call.enqueue(new Callback<TalukResponse>() {
        @Override
        public void onResponse(@NonNull Call<TalukResponse> call, @NonNull Response<TalukResponse> response) {
            TalukResponse talukResponse = response.body();
            if (Objects.requireNonNull(talukResponse).getStatus().equals(getString(R.string.http_ok))) {
                talukList.addAll(talukResponse.getTaluks());
                talukAdapter.notifyDataSetChanged();
            } else {
                Toast.makeText(activity, talukResponse.getMessage(), Toast.LENGTH_LONG).show();
            }

        }

        @Override
        public void onFailure(@NonNull Call<TalukResponse> call, @NonNull Throwable t) {
            Toast.makeText(activity, R.string.check_internet, Toast.LENGTH_LONG).show();
        }
    });
}

private void fetchDistricts() {

    districtList.clear();

    Call<DistrictResponse> call = api.getDistricts("31");
    call.enqueue(new Callback<DistrictResponse>() {
        @Override
        public void onResponse(@NonNull Call<DistrictResponse> call, @NonNull Response<DistrictResponse> response) {
            if (isAdded()) {
                DistrictResponse districtResponse = response.body();
                if (Objects.requireNonNull(districtResponse).getStatus().equals(getString(R.string.http_ok))) {
                    districtList.addAll(districtResponse.getDistricts());
                    districtAdapter.notifyDataSetChanged();
                } else {
                    Toast.makeText(activity, districtResponse.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        }

        @Override
        public void onFailure(@NonNull Call<DistrictResponse> call, @NonNull Throwable t) {
            Toast.makeText(activity, R.string.check_internet, Toast.LENGTH_LONG).show();
        }
    });
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    this.activity = (AppCompatActivity) context;
    mainInterface = (MainInterface) context;
}

@Override
public void onStart() {
    super.onStart();
    activity.setTitle(R.string.app_name);
}
}`

更新:我尝试在我的onViewCreated()中手动延迟第二个网络调用,但由于某种原因它可以工作。 WTF?!

fetchDistricts();
Handler handler = new Handler();
handler.postDelayed(this::fetchPremiumStudios, 2000);

1 个答案:

答案 0 :(得分:0)

您的问题与您的项目选择设置相符。

加载区域后,它将更新微调器适配器,这将触发选择更改。

在此方法中,您将清除所有已加载的工作室。

因此,如果在加载工作室后区域调用完成,您将重置studioAdapter。

spinnerDistrict.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
        // This will clear your loaded studios
        studioList.clear();
        studioAdapter.notifyDataSetChanged();
    }

});