0

i'm implement recycler view and i use retrofit to fetch data from api the data as a array json
after that i'm implement retrofit object , inside the for loop i have problem i can't fetch data send data for model and i don't have any error message , just blank screen and this message in logat

E/RecyclerView: No adapter attached; skipping layout

this is my mainActivity :

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private ProgressBar progressBar;
    private LinearLayoutManager mlinearLayout;
    ArrayList<Model> list;
    Adapter adapter;
    String url = "https://d17h27t6h515a5.cloudfront.net/";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listitem);

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        progressBar = (ProgressBar) findViewById(R.id.progressbar);
        mlinearLayout = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(mlinearLayout);


        list = new ArrayList<>();

        getRetrofitArray();
        adapter=new Adapter(list ,MainActivity.this);

        recyclerView.setAdapter(adapter);

    }

    public void getRetrofitArray() {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RetrofitArrayAPI servese =retrofit.create(RetrofitArrayAPI.class);
        Call< List<Recipe>> call=servese.getRecipeDetails();
        call.enqueue(new Callback<List<Recipe>>() {
            @Override
            public void onResponse(Call<List<Recipe>> call, Response<List<Recipe>> response) {
                for(int i=0;i<response.body().size();i++){
                    list.add(new Model(response.body().get(i).getName(),response.body().get(i).getServings(),Model.Image));

                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<List<Recipe>> call, Throwable t) {
                Log.e("main","retrifit error"+ t.toString());

            }
        });

    }

my modele

wad
  • 25
  • 3
  • 10

2 Answers2

0

Try this once:

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ProgressBar progressBar;
private LinearLayoutManager mlinearLayout;
ArrayList<Model> list;
Adapter adapter;
String url = "https://d17h27t6h515a5.cloudfront.net/";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.listitem);

    list = new ArrayList<>();
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    progressBar = (ProgressBar) findViewById(R.id.progressbar);
    mlinearLayout = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(mlinearLayout);
    adapter=new Adapter(list ,MainActivity.this);
    recyclerView.setAdapter(adapter);

    getRetrofitArray();

}

public void getRetrofitArray() {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(url)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    RetrofitArrayAPI servese =retrofit.create(RetrofitArrayAPI.class);
    Call< List<Recipe>> call=servese.getRecipeDetails();
    call.enqueue(new Callback<List<Recipe>>() {
        @Override
        public void onResponse(Call<List<Recipe>> call, Response<List<Recipe>> response) {
            list=response.body();
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onFailure(Call<List<Recipe>> call, Throwable t) {
            Log.e("main","retrifit error"+ t.toString());

        }
    });

}

let me know if this works for you.

Shweta Chauhan
  • 6,739
  • 6
  • 37
  • 57
-1

When you want to change data in adapter you need to change it with a setter method for data in adapter then call notifyDataSetChanged()

for example :

list = getNewData();
adapter.setData(list); //need to set every time that data was changed
adapter.notifyDataSetChanged();
Alireza
  • 183
  • 1
  • 10