java - RecyclerView 未附加到 Adapter

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

我有这个错误。我正在从 API 下载数据,我想在嵌套在名为 ListFragment 的 Fragment 中的 RecyclerView 中打印它。 。该 fragment 是我在 ViewPager 中使用的三个 fragment 之一。 ViewPager工作正常。现在,我只想显示两个 TextView 。它们的布局名称为 single_data_layoutList<Feature> features是我的DataResponse 。项目正常构建,没有问题,我在日志中收到“数据已成功下载”。当我在 Debug模式下运行应用程序时,我收到消息说我的 RecyclerView未连接至适配器。有什么想法吗?

API客户端:

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

数据适配器:

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

列表 fragment :

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

最佳答案

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

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

关于java - RecyclerView 未附加到 Adapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42716889/

相关文章:

java - 我正在尝试通过使用 Java 8 流遍历嵌入式列表来返回数据

java - 我应该使用哪个 Jersey 依赖项?

android - 在特定的 x\y 坐标上绘制自定义 View

android - 非法状态异常 : Could not find method insert(View) in a parent or ancestor Context class android. support.v7.widget.AppCompatButton

Android Studio - ADB 错误 - "...device unauthorized. Please check the confirmation dialog on your device."

java - 打开 Android 应用程序时重定向到网页

java - 从数据库中选择后如何使用mybatis获取结果类型作为列表

java - Spring 启动 : A ServletContext is required to configure default servlet handling

android - 在Android中绘制图表线

java - 如何将字符串添加到特定位置的其他字符串中