简体   繁体   中英

Recycler view: no adapter attached; skipping layout(Error in recycler view for API )

This is the recycler view activity. Here I have initialized the recycler view. Despite that I am getting error. Where might have I gone wrong. In the log cat I get the error

No adapter attached; skipping layout No adapter attached; skipping layout .

Here I am getting response display the response in the recycler view using APIs. I am also using retrofit too. In the get data() function I am taking the response status and getting data.

public class MainActivity extends AppCompatActivity {



    RecyclerView recyclerView;
    ListAdapter1 listAdapter;
//    List<SupermarketModels> supermarketModelsList = new ArrayList<>();
    ApiInterface apiInterface;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initialization();
        getdata();
    }

    private void initialization(){
        recyclerView = findViewById(R.id.recyclerview);
        Retrofit retrofit = APIClient.getclient();
        apiInterface = retrofit.create(ApiInterface.class);
    }

    private void setadapter(List<SupermarketModels> supermarketModels){

        listAdapter = new ListAdapter1(this, supermarketModels);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

        recyclerView.setLayoutManager(linearLayoutManager);

        recyclerView.setAdapter(listAdapter);

        listAdapter.notifyDataSetChanged();


    }
    private void getdata(){
        apiInterface.getList().enqueue(new Callback<GetListResponse>() {
            @Override
            public void onResponse(Call<GetListResponse> call, Response<GetListResponse> response) {

                try {
                    if (response!= null){
                        if (response.body().getStatus().equals("1")){
                            setadapter(response.body().getData());


                        }
                        else {
                            Toast.makeText(MainActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    }
                } catch (Exception e){
                    Log.e("exp", e.getLocalizedMessage());

                }

            }

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

            }
        });

    }
} 

you have to setOrientation() to your layout manager.and remove notifyDataSetChanged() line from there.

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); //or HORIZONTLE,whatever you want
    
            recyclerView.setLayoutManager(linearLayoutManager);
    
            recyclerView.setAdapter(listAdapter);
    
            listAdapter.notifyDataSetChanged(); //remove this line from here

This error can be avoid setting empty adapter first before setting actual adapter, when data is actually loading. In your example before calling getdata() you just call empty adapter like this

EmptyAdapter emptyAdapter = new EmptyAdapter();
recyclerView.setAdapter(emptyAdapter);

Here is Empty Adapter class, which you need to create

import android.view.View;
import android.view.ViewGroup;

import androidx.recyclerview.widget.RecyclerView;

public class EmptyAdapter extends RecyclerView.Adapter<EmptyAdapter.EmptyHolder> {
@Override
public EmptyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return null;
}

@Override
public void onBindViewHolder(EmptyHolder holder, int position) {

}

@Override
public int getItemCount() {
    return 0;
}

class EmptyHolder extends RecyclerView.ViewHolder {
    public EmptyHolder(View itemView) {
        super(itemView);
    }
}
}

First, let's create a simple adapter which accepts no data and has a method which allows us to add data and notify adapter.

package adapters;

// TODO: Replace with your package

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

// TODO: Replace import of your package
import tech.gjirafa.tonosdemo.R;

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.ViewHolder> {

private Context context;
// TODO: Replace data type from String with your model
private ArrayList<String> data = new ArrayList<>();

public SimpleAdapter(Context context) {
    this.context = context;
}

// TODO: Replace data type from String with your model
public void setData(ArrayList<String> data) {
    this.data.addAll(data);
    notifyDataSetChanged();
}

@NonNull
@Override
public SimpleAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // TODO: adapter_news_item with your layout
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_news_item, parent, false));
}

@Override
public void onBindViewHolder(@NonNull SimpleAdapter.ViewHolder holder, int position) {
    // TODO: Add your bindings
}

@Override
public int getItemCount() {
    return data.size();
}

static class ViewHolder extends RecyclerView.ViewHolder {

    // TODO: Declare your views here so you can access them onBindViewHolder()
    
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
    }
}
}

Then on your activity, do the following:

package activities;

// TODO: Replace with your package

import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

// TODO; Replace with your packageId

import com.google.gson.JsonObject;

import adapters.SimpleAdapter;
import tech.gjirafa.tonosdemo.R;

public class MainActivity extends AppCompatActivity {

SimpleAdapter simpleAdapter = new SimpleAdapter(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // TODO: Replace your layout
    setContentView(R.layout.activity_demo);
    setupAdapter();
    fetchData();
}

private void setupAdapter() {
    RecyclerView recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setAdapter(simpleAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
}

private void fetchData() {
    APIClient.getclient().create(ApiInterface.class).getList().enqueue(new Callback<GetListResponse>() {
        @Override
        public void onResponse(Call<GetListResponse> call, Response<GetListResponse> response) {
            try {
                if (response!= null){
                    if (response.body().getStatus().equals("1")){
                        simpleAdapter.setData(response.body().getData());
                    } else {
                        Toast.makeText(MainActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            } catch (Exception e){
                Log.e("exp", e.getLocalizedMessage());
            }
        }

        @Override
        public void onFailure(Call<GetListResponse> call, Throwable t) {
            Log.e("onFailure", t.getLocalizedMessage());
        }
    });
}
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM