RecyclerView没有连接到Adapter

时间:2017-03-10 11:06:40

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

我有这个惊悚错误。我从API下载数据,我想将它打印在嵌套在名为ListFragment的Fragment中的RecyclerView中。这个片段是我在ViewPager中使用的三个片段之一。 ViewPager工作正常。现在,我想只显示两个textViews。它们的布局名称为single_data_layoutList<Feature> featuresDataResponse。项目正常构建没有问题,我在Log中收到&#34;数据已成功下载&#34;。当我在DebugMode中运行应用程序时,我收到的消息是RecyclerView没有附加到适配器。有什么想法吗?

ApiClient:

public interface ApiClient {

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

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:

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

2 个答案:

答案 0 :(得分:1)

我看到适配器类没有上下文,我想如果你添加到适配器构造函数Context c作为第二个参数你的问题将被解决

尝试重播

 public DataAdapter(List<Feature> features) {

    this.features = features;
}

由此

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

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

并在片段类中替换此行

adapter = new DataAdapter(features);

由此     adapter = new DataAdapter(features,getActivity());

希望这会对你有所帮助:)。

答案 1 :(得分:1)

您应该更改扩充布局的方式。这应该可以解决问题。

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