【问题标题】:Recycler view: no adapter attached; skipping layout(Error in recycler view for API )回收站视图:未连接适配器;跳过布局(API 回收站视图中的错误)
【发布时间】:2022-01-18 11:31:53
【问题描述】:

这是回收者视图活动。在这里,我已经初始化了回收站视图。尽管我得到了错误。我可能哪里出错了。在日志猫中我得到了错误

No adapter attached; skipping layout.

在这里,我正在使用 API 在回收站视图中显示响应。我也在使用改造。在get 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) {

            }
        });

    }
} 

【问题讨论】:

    标签: java android android-studio android-recyclerview adapter


    【解决方案1】:

    你必须 setOrientation() 到你的布局管理器。然后从那里删除 notifyDataSetChanged() 行。

    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
    

    【讨论】:

    • 做到了。仍然得到同样的错误。 No adapter attached; skipping layout
    • 尝试添加此行,在设置适配器之前可能会这样做recyclerView.setHasFixedSize(true);
    【解决方案2】:

    这个错误可以避免在实际加载数据时,在设置实际适配器之前先设置空适配器。在您调用 getdata() 之前的示例中,您只需像这样调用空适配器

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

    这是你需要创建的空适配器类

    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);
        }
    }
    }
    

    【讨论】:

    • 我这样做了。但仍然遇到同样的错误。
    • 你在getdata()之前设置了适配器吗? ?我检查了但没有出错。
    • 是的。我这样做了。仍然出现错误。我在initialization();getData() 之间输入了recyclerView.setAdapter(emptyAdapter);
    【解决方案3】:

    首先,让我们创建一个简单的适配器,它不接受任何数据,并且有一个允许我们添加数据和通知适配器的方法。

    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);
        }
    }
    }
    

    然后在您的活动中,执行以下操作:

    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());
            }
        });
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 2018-03-16
      相关资源
      最近更新 更多