I can not understand why loading data into RecyclerView only once, i.e. I receive in JSON format data about 8 users, but the adapter processes only one, and in the loop I loop through I get everything.

In the loop:

Example example = response.body(); Data data = example.getData(); List<Dialog> dialogs = data.getDialogs(); Log.i("Data", data.getPagesCount() + "-" + data.getEnd()); for (int i = 0; i < dialogs.size(); i++) { Log.i("Data", dialogs.get(i).getFromUser().getName()); } 

In the adapter:

 public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> { private List<Example> exampleData; DataAdapter(List<Example> examples) { this.exampleData = examples; } @NonNull @Override public DataAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.list_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull DataAdapter.ViewHolder holder, int position) { Example example = exampleData.get(position); holder.name.setText(example.getData().getDialogs().get(position).getFromUser().getName()); holder.name2.setText(example.getData().getDialogs().get(position).getFromUser().getLastAuth()); Log.i("Data", String.valueOf(position)); // Только один раз } @Override public int getItemCount() { if (exampleData == null) { return 0; } return exampleData.size(); } class ViewHolder extends RecyclerView.ViewHolder { TextView name, name2; public ViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.nameTextView); name2 = (TextView) itemView.findViewById(R.id.name2TextView); } }} 

Cause

 public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; List<Example> mExample; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mExample = new ArrayList<>(); mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(layoutManager); DataAdapter adapter = new DataAdapter(mExample); mRecyclerView.setAdapter(adapter); TestServices testServices = TestServices.retrofit.create(TestServices.class); final Call<Example> call = testServices.getData(); call.enqueue(new Callback<Example>() { @Override public void onResponse(Call<Example> call, Response<Example> response) { if (response.isSuccessful()) { mExample.addAll(Collections.singleton(response.body())); mRecyclerView.getAdapter().notifyDataSetChanged(); // Example example = response.body(); // Data data = example.getData(); // List<Dialog> dialogs = data.getDialogs(); // Log.i("Data", data.getPagesCount() + "-" + data.getEnd()); // for (int i = 0; i < dialogs.size(); i++) { // Log.i("Data", dialogs.get(i).getFromUser().getName()); // } } else { ResponseBody errorBody = response.errorBody(); try { Toast.makeText(MainActivity.this, errorBody.string(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onFailure(Call<Example> call, Throwable throwable) { Log.i("Error", "Что-то пошло не так: " + throwable.getMessage()); } }); } } 

Fixed on

 Example example = response.body(); Data data = example.getData(); List<Dialog> dialogs = data.getDialogs(); mExample.addAll(dialogs); mRecyclerView.getAdapter().notifyDataSetChanged(); 

In the adapter on

 Dialog example = exampleData.get(position); holder.name.setText(example.getFromUser().getName()); holder.name2.setText(example.getFromUser().getLastAuth()); Log.i("Data", example.getFromUser().getName()); Log.i("Data", example.getFromUser().getLastAuth()); 

Now everything is displayed correctly in the log, but in RecyclerView there is also only one

    1 answer 1

    You are passing an Example object to the adapter - but you need to pass a Dialog list

     mExample.addAll(Arrays.asList(response.body().getData().getDialogs())); 

    Well, in the adapter in the constructor, take:

     private List<Dialog> dialogList; DataAdapter(List<Dialog> dialogList) { this.dialogList = dialogList; } 

    It turns out that in the cycle you get the data correctly (Dialog list) and in the adapter you transfer the Example object which is the responce.

    • It did not help, the same effect - dev.android
    • changed the answer .. - Eugene Zaychenko
    • Changed as advised @EugeneZaychenko to Example example = response.body(); Data data = example.getData(); List<Dialog> dialogs = data.getDialogs(); mExample.addAll(dialogs); Example example = response.body(); Data data = example.getData(); List<Dialog> dialogs = data.getDialogs(); mExample.addAll(dialogs); Also added Log.i("Data", example.getFromUser().getName()); in the adapter Log.i("Data", example.getFromUser().getName()); to see what is happening, it displays all the data in the log as it should be, but RecyclerView doesn’t display - dev.android
    • I do not understand why there is data in the logs and there is no data in RecyclerView? Dialog example = exampleData.get(position); holder.name.setText(example.getFromUser().getName()); holder.name2.setText(example.getFromUser().getLastAuth()); Log.i("Data", example.getFromUser().getName()); - dev.android
    • Thanks for the advice. The problem was solved as CardView was connected, honestly to say a strange glitch - dev.android