为什么我的recyclerView不显示任何数据?

时间:2019-02-19 12:39:50

标签: android android-recyclerview recycler-adapter

我已经多次实现了RecyclerView和客户适配器,但是由于某种原因,我无法使它显示任何数据。我正在使用翻新从JSON中输入数据,并在加载后调用notifyDataSetChanged(),但仍然保持空白。我将其剥离为仅一种文本视图以尝试简化,但仍然没有得到任何结果。谁能看到我在哪里出问题了?

当我调试时,我得到的列表中包含数据,所以我绝对可以正确地解析数据,只是无法使其显示在回收者视图中。我什至在loadTrailerList方法中检查了list.size(),它具有数据。

我的活动onCreate方法:

trailerAdapter = new TrailerAdapter(this);
trailerRecyclerView = findViewById(R.id.trailer_recycler_view);
trailerRecyclerView.setLayoutManager(new LinearLayoutManager(this));
trailerRecyclerView.setAdapter(trailerAdapter);

改造响应方法:

if (response.body() != null) {
                trailers = response.body().getTrailers();
            }
            trailerAdapter.loadTrailerList(response.body().getTrailers());

我的自定义适配器:

public class TrailerAdapter extends RecyclerView.Adapter<TrailerAdapter.TrailerViewHolder> {

    private final List<Trailer> trailerList = new ArrayList<>();
    private final TrailerClickListener listener;

    public TrailerAdapter(TrailerClickListener listener) {
        this.listener = listener;
    }

    @NonNull
    @Override
    public TrailerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.trailer_list_item, viewGroup, false);
        return new TrailerViewHolder(itemView, this);
    }

    @Override
    public void onBindViewHolder(@NonNull TrailerViewHolder trailerViewHolder, int i) {
        trailerViewHolder.trailerTitle.setText(trailerList.get(i).getName());
    }

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

    public void loadTrailerList(List<Trailer> trailers) {
        this.trailerList.clear();
        if (trailers != null) {
            trailers.addAll(trailers);
        }
        notifyDataSetChanged();
    }

    class TrailerViewHolder extends RecyclerView.ViewHolder {

        final TrailerAdapter trailerAdapter;
        private final TextView trailerTitle;

        private TrailerViewHolder(@NonNull View itemView, TrailerAdapter trailerAdapter) {
            super(itemView);
            this.trailerAdapter = trailerAdapter;
            trailerTitle = itemView.findViewById(R.id.text_view_trailer_title);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onTrailerClicked(trailerList.get(getAdapterPosition()));
                }
            });
        }
    }
}

我的列表项XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

            <TextView
                android:id="@+id/text_view_trailer_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Play Trailer" />

</LinearLayout>

我的活动XML中的回收者视图:

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/trailer_recycler_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:background="@color/colorPrimary"
                        app:layout_constraintTop_toBottomOf="@+id/trailer_divider">

                    </android.support.v7.widget.RecyclerView>

我感谢任何能将我指向正确方向的人

2 个答案:

答案 0 :(得分:1)

这是因为您要向适配器发送列表,但是没有初始化适配器中使用的列表。

尝试一下。

public void loadTrailerList(List<Trailer> trailers) {
        this.trailerList.clear();
        if (trailers != null) {
            trailerList = trailers;
        }
        notifyDataSetChanged();
    }

答案 1 :(得分:0)

Do!我只是意识到自己在做什么错了:

在适配器的loadTrailerList()方法中,我正在调用:

trailers.addAll(trailers);

代替:

trailerList.addAll(trailers);

将项目列表加载到实际的ArrayList中!哎呀!