片段未装入主机。通过Android中的翻新进行api调用时

问题描述 投票:0回答:1

这是我在导航抽屉中使用的片段之一。我从api填充数据并在recyclerview中显示。我已经检查了日志,它在日志中显示数据,但是在回收者视图中没有填充数据。我尝试了断点和日志。数据进入arraylist,我也尝试使用正在显示的静态数据。我无法理解我想念的地方。并且由于这个片段,其他片段也没有加载到主机中。它显示为空白。预先感谢。

public class HomeFragment extends Fragment {

private Context mContext;
private RecyclerView rvMain;
ArrayList<DataModel> arrayList;
private ProgressBar pb;
private ApiInterface apiInterface;

public HomeFragment(Context mContext) {
    this.mContext = mContext;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_main, container, false);
}

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

    Log.d("Fragment", "onViewCreated: ");
    rvMain = view.findViewById(R.id.main_category_rv);
    pb = view.findViewById(R.id.main_pb);
    arrayList = new ArrayList<>();

    prepareData();
    pb.setVisibility(View.GONE);
}

private void prepareData() {
    pb.setVisibility(View.VISIBLE);
    apiInterface = ApiRequest.createService(ApiInterface.class);

    Call<MainCategoryModel> call = apiInterface.readJson();

    call.enqueue(new Callback<MainCategoryModel>() {
        @Override
        public void onResponse(Call<MainCategoryModel> call, Response<MainCategoryModel> response) {
            if (response.isSuccessful()) {
                for (int i = 0; i < response.body().getData().getCategory().size(); i++) {
                    arrayList.add(new DataModel(response.body().getData().getCategory().get(i).getTitle(), response.body().getData().getCategory().get(i).getImage()));
                }
            } else {
                Log.d("Response", "onResponse: " + response.errorBody());
            }
        }

        @Override
        public void onFailure(Call<MainCategoryModel> call, Throwable t) {

        }
    });
    DataAdapter adapter = new DataAdapter(mContext, arrayList, new DataAdapter.RecyclerViewClickListener() {
        @Override
        public void onClick(View view, int position) {

        }
    });
    rvMain.setAdapter(adapter);

    AutoFitGridLayoutManager layoutManager = new AutoFitGridLayoutManager(mContext, 500);
    rvMain.setLayoutManager(layoutManager);
  }
}
android android-studio android-fragments retrofit2 android-fragmentactivity
1个回答
1
投票

首先,在任何方法之外使适配器在该活动中是全局的

DataAdapter adapter;

然后您需要通知适配器您已经添加了数据

yourAdapter.notifyDataSetChanged();

您的prepareData方法应该像这样

private void prepareData() {
    pb.setVisibility(View.VISIBLE);
    apiInterface = ApiRequest.createService(ApiInterface.class);

    adapter = new DataAdapter(mContext, arrayList, new DataAdapter.RecyclerViewClickListener() {
        @Override
        public void onClick(View view, int position) {

        }
    });

    AutoFitGridLayoutManager layoutManager = new AutoFitGridLayoutManager(mContext, 500);

    Call<MainCategoryModel> call = apiInterface.readJson();

    call.enqueue(new Callback<MainCategoryModel>() {
        @Override
        public void onResponse(Call<MainCategoryModel> call, Response<MainCategoryModel> response) {
            if (response.isSuccessful()) {
                for (int i = 0; i < response.body().getData().getCategory().size(); i++) {
                    arrayList.add(new DataModel(response.body().getData().getCategory().get(i).getTitle(), response.body().getData().getCategory().get(i).getImage()));
                }
                adapter.notifyDataSetChanged(); // notify your adapter here
            } else {
                Log.d("Response", "onResponse: " + response.errorBody());
            }
        }

        @Override
        public void onFailure(Call<MainCategoryModel> call, Throwable t) {

        }
    });
    rvMain.setAdapter(adapter);
    rvMain.setLayoutManager(layoutManager);
  }
}

为什么静态数据向您显示列表,因为它是同步的,但是改型队列使用的是异步调用,所以可能需要很少的时间来获取数据

© www.soinside.com 2019 - 2024. All rights reserved.