我的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);
答案 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();
}
});