简体   繁体   English

RecyclerView未附加到适配器

[英]RecyclerView isn't attached to Adapter

I have this strage error. 我有这个暂存错误。 I'm downloading data from API and I want to print it in RecyclerView nested in Fragment called ListFragment . 我正在从API下载数据,我想在嵌套在称为ListFragment Fragment中的RecyclerView中打印数据。 This fragment is one of three which I use in ViewPager . 该片段是我在ViewPager使用的三个片段之一。 ViewPager works fine. ViewPager工作正常。 For now, I want to display only two textViews. 现在,我只想显示两个textViews。 Layout for them has name single_data_layout . 它们的布局名称为single_data_layout List<Feature> features is my DataResponse . List<Feature> features是我的DataResponse Project builds normaly without issues and I receive in Log that "Data is successfully downloaded". 项目正常构建,没有问题,我在日志中收到“数据已成功下载”。 When I run app in DebugMode I get message that my RecyclerView isn't attached to adapter. 当我在DebugMode中运行应用程序时,我收到一条消息,指出我的RecyclerView未连接到适配器。 Any ideas? 有任何想法吗?

ApiClient: ApiClient:

public interface ApiClient {

    @GET("/query?format=geojson&starttime&minsig=700")
    Call<DataResponse> getData();
}

ApiClientFactory: ApiClientFactory:

public class ApiClientFactory {

    public static final String baseURL = "https://earthquake.usgs.gov/fdsnws/event/1/";

    public ApiClient createApiClient(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseURL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit.create(ApiClient.class);
    }
}

DataAdapter: 数据适配器:

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.DataViewHolder> {

    private List<Feature> features;
    private ListFragment listFragment;
    private Context context;
    private LayoutInflater inflater;

    public DataAdapter(List<Feature> features) {

        this.features = features;
    }

    @Override
    public DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        inflater = LayoutInflater.from(context);
        View contractView = inflater.inflate(R.layout.single_data_layout, parent, false);

        return new DataViewHolder(contractView);
    }

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

        holder.place.setText(features.get(position).getProperties().getPlace());
        holder.alert.setText(features.get(position).getProperties().getAlert());
    }

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

    public static class DataViewHolder extends RecyclerView.ViewHolder {

        private final TextView place;
        private final TextView alert;

        public DataViewHolder(View view) {
            super(view);
            place = (TextView) view.findViewById(R.id.place_text_view);
            alert = (TextView) view.findViewById(R.id.alert_text_view);
        }
    }
}

ListFragment: ListFragment:

public class ListFragment extends Fragment {

    private RecyclerView recyclerView;
    private static final String TAG = ListFragment.class.getSimpleName();
    private ApiClient apiClient;
    private List<Feature> features;
    private RecyclerView.LayoutManager layoutManager;
    private DataAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, container, false);

        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        getData();

        return view;
    }

    private void getData() {
        apiClient = new ApiClientFactory().createApiClient();

        apiClient.getData().enqueue(new Callback<DataResponse>() {
            @Override
            public void onResponse(Call<DataResponse> call, Response<DataResponse> response) {
                if (response.isSuccessful()) {
                    features = response.body().getFeatures();

                    adapter = new DataAdapter(features);
                    layoutManager = new LinearLayoutManager(getActivity());

                    recyclerView.setAdapter(adapter);
                    recyclerView.setLayoutManager(layoutManager);

                }
                Log.d(TAG, "Data successfully downloaded");
            }

            @Override
            public void onFailure(Call<DataResponse> call, Throwable t) {
                Log.e(TAG, t.toString());
            }
        });
    }
}

I see that the adapter class don't have a context , I guess if you add to the adapter constructor Context c as a second parameter your problem will be solved 我看到适配器类没有上下文,我想如果您将适配器构造函数Context c作为第二个参数添加,您的问题将得到解决

try to replase 尝试取代

 public DataAdapter(List<Feature> features) {

    this.features = features;
}

by this 这样

  public DataAdapter(List<Feature> features, Context c) {

    this.features = features;
    this.context = c;
}

and replace this line in the fragment class 并在片段类中替换此行

adapter = new DataAdapter(features);

by this adapter = new DataAdapter(features,getActivity()); 通过此适配器= new DataAdapter(features,getActivity());

hope this will help you :) 希望这个能对您有所帮助 :)

You should change the way you inflate the layout. 您应该更改膨胀布局的方式。 This should do the trick. 这应该可以解决问题。

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.DataViewHolder> {

    private List<Feature> features;

    public DataAdapter(List<Feature> features) {
        this.features = features;
    }

    @Override
    public DataAdapter.DataViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_data_layout, parent, false);
        return new DataViewHolder(view);
    }

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

        holder.place.setText(features.get(position).getProperties().getPlace());
        holder.alert.setText(features.get(position).getProperties().getAlert());
    }

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

    public static class DataViewHolder extends RecyclerView.ViewHolder {

        private final TextView place;
        private final TextView alert;

        public DataViewHolder(View view) {
            super(view);
            place = (TextView) view.findViewById(R.id.place_text_view);
            alert = (TextView) view.findViewById(R.id.alert_text_view);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RecyclerView未连接适配器 - RecyclerView No adapter attached 未连接适配器; 使用RecyclerView跳过布局 - No adapter attached; skipping layout with RecyclerView RecyclerView:没有附加适配器:跳过布局 - RecyclerView: No adapter attached:skipping layout 没有附加适配器使用 RecyclerView 适配器跳过布局错误 - No Adapter Attached Skipping layout error with RecyclerView Adapter 未连接适配器; 跳过布局:RecyclerView(带适配器) - No adapter attached; skipping layout : RecyclerView (with adapter) RecyclerView 适配器连接错误:未连接适配器 - RecyclerView adapter connection error: no adapter attached 使用 recyclerview 设置适配器时“未连接适配器”即将到来 - While setting adapter with recyclerview “No Adapter Attached” is coming 为什么我的 RecyclerView 不显示我的适配器项目? - Why isn't my RecyclerView displaying my adapter items? E/RecyclerView:没有附加适配器; 在 recyclerview 跳过布局和视图 0 并且不显示 recyclerview - E/RecyclerView: No adapter attached; skipping layout and view 0 at recyclerview and not showing recyclerview 片段中的RecyclerView - 没有附加适配器,跳过布局 - RecyclerView in Fragment - No Adapter Attached, Skipping Layout
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM