如何在片段中使用CardView运行我的RecyclerView?

问题描述 投票:0回答:4

我有这个代码,每次我试图运行它..应用程序没有运行没有错误但没有运行任何人都可以帮助我确定是什么原因得到这种问题。

因为我在片段中用CardView做RecyclerView我差不多一周有这个问题:(

这是我的代码:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private Context mContext ;
    private List<Book> mData ;


    public RecyclerViewAdapter(Context mContext, List<Book> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    public RecyclerViewAdapter(TimeFragment timeFragment, List<Book> lstBook) {
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view ;
        LayoutInflater mInflater = LayoutInflater.from(mContext);
        view = mInflater.inflate(R.layout.cardveiw_item_book,parent,false);
        return new MyViewHolder(view);
    }

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

        holder.tv_book_title.setText(mData.get(position).getTitle());
        holder.img_book_thumbnail.setImageResource(mData.get(position).getThumbnail());
    }

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

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView tv_book_title;
        public ImageView img_book_thumbnail;
        CardView cardView ;

        public MyViewHolder(View itemView) {
            super(itemView);

            tv_book_title = (TextView) itemView.findViewById(R.id.book_title_id) ;
            img_book_thumbnail = (ImageView) itemView.findViewById(R.id.book_img_id);
            cardView = (CardView) itemView.findViewById(R.id.cardview_id);


        }
    }


}

这是相关的POJO课程。

public class Book {

    private String Title;
    private String Category ;
    private String Description ;
    private int Thumbnail ;

    public Book() {
    }

    public Book(String title, String category, String description, int thumbnail) {
        Title = title;
        Category = category;
        Description = description;
        Thumbnail = thumbnail;
    }


    public String getTitle() {
        return Title;
    }

    public String getCategory() {
        return Category;
    }

    public String getDescription() {
        return Description;
    }

    public int getThumbnail() {
        return Thumbnail;
    }


    public void setTitle(String title) {
        Title = title;
    }

    public void setCategory(String category) {
        Category = category;
    }

    public void setDescription(String description) {
        Description = description;
    }

    public void setThumbnail(int thumbnail) {
        Thumbnail = thumbnail;
    }
}

将适配器设置为RecyclerView的片段的代码。

public class TimeFragment extends Fragment {
    List<Book> lstBook ;

    public TimeFragment() {
    }

    @Nullable

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        lstBook = new ArrayList<>();
        lstBook.add(new Book("The Vegitarian","Categorie Book","Description book",R.drawable.ic_in));
        lstBook.add(new Book("The Wild Robot","Categorie Book","Description book",R.drawable.ic_out));
        lstBook.add(new Book("Maria Semples","Categorie Book","Description book",R.drawable.ic_in));
        lstBook.add(new Book("The Martian","Categorie Book","Description book",R.drawable.ic_out));
    }


    @Nullable
    @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view;

        view = inflater.inflate( R.layout.recyclerview, container, false);
        RecyclerView myrv = (RecyclerView) view.findViewById(R.id.recyclerview_id);
        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(this,lstBook);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
        myrv.setLayoutManager(gridLayoutManager);
        myrv.setAdapter(myAdapter);
        return view;
    }
}
android android-fragments android-recyclerview recycler-adapter android-cardview
4个回答
0
投票

实际上有两种方法可以做到这一点。

1.从RecyclerViewAdapter中删除下面提到的行。

public RecyclerViewAdapter(TimeFragment timeFragment,List lstBook){}

在片段代码中,还有一个小的变化,请看下面的代码,我也没有drawable,所以我使用了默认的。

public class TimeFragment extends Fragment {

    List<Book> lstBook ;

    public TimeFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        lstBook = new ArrayList<>();
        lstBook.add(new Book("The Vegitarian","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("The Wild Robot","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("Maria Semples","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("The Martian","Categorie Book","Description book",R.drawable.ic_launcher_background));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_time, container, false);

        RecyclerView myrv = (RecyclerView) view.findViewById(R.id.recyclerview_id);
        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getContext(),lstBook);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
        myrv.setLayoutManager(gridLayoutManager);
        myrv.setAdapter(myAdapter);
        return view;
    }

}

如果你不删除上述线路仍然可以工作。只需修改TimeFragment的代码即可。

  1. 发生的事情是当您在适配器构造函数中有上下文时,您实际上使用了适配器的第二个构造函数,该构造函数接受如下所示的参数 public RecyclerViewAdapter(TimeFragment timeFragment,List lstBook){ }

在这里,您实际上没有填充列表,您已在下面显示的第一个构造函数中完成了该列表。

public RecyclerViewAdapter(Context mContext, List<Book> mData) {
    this.mContext = mContext;
    this.mData = mData;
}

现在应用程序崩溃,因为当它在适配器中找到列表时,它总是为空。所以它崩溃了。我在适配器部分和片段部分的代码中更改了几行。请在下面找到更改。

RecyclerViewAdapter:

   public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

        private Context mContext ;
        private List<Book> mData ;
        private TimeFragment timeFragment;


        public RecyclerViewAdapter(Context mContext, List<Book> mData) {
            this.mContext = mContext;
            this.mData = mData;
        }

        public RecyclerViewAdapter(TimeFragment timeFragment, List<Book> lstBook) {
            this.timeFragment = timeFragment;
            this.mData = lstBook;
        }

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View view ;
            LayoutInflater mInflater = LayoutInflater.from(timeFragment.getContext());
            view = mInflater.inflate(R.layout.cardveiw_item_book,parent,false);
            return new MyViewHolder(view);
        }

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

            holder.tv_book_title.setText(mData.get(position).getTitle());
            holder.img_book_thumbnail.setImageResource(mData.get(position).getThumbnail());
        }

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

        public static class MyViewHolder extends RecyclerView.ViewHolder {

            public TextView tv_book_title;
            public ImageView img_book_thumbnail;
            CardView cardView ;

            public MyViewHolder(View itemView) {
                super(itemView);
                tv_book_title = (TextView) itemView.findViewById(R.id.book_title_id) ;
                img_book_thumbnail = (ImageView) itemView.findViewById(R.id.book_img_id);
                cardView = (CardView) itemView.findViewById(R.id.cardview_id);
            }
        }


    }

时间片段:

public class TimeFragment extends Fragment {

    List<Book> lstBook ;

    public TimeFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("TestFailed","OnCreate");
        lstBook = new ArrayList<>();
        lstBook.add(new Book("The Vegitarian","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("The Wild Robot","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("Maria Semples","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("The Martian","Categorie Book","Description book",R.drawable.ic_launcher_background));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Log.d("TestFailed","OnCreateView");
        View view = inflater.inflate(R.layout.fragment_time, container, false);

        RecyclerView myrv = (RecyclerView) view.findViewById(R.id.recyclerview_id);
        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(this,lstBook);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
        myrv.setLayoutManager(gridLayoutManager);
        myrv.setAdapter(myAdapter);
        return view;
    }

}

希望能帮助并消除疑虑。


0
投票

没有从您的片段传递上下文。您传递的是TimeFragment,因此调用的构造函数是

public RecyclerViewAdapter(TimeFragment timeFragment, List<Book> lstBook)

请改用活动上下文。

RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getActivity(),lstBook);

0
投票

在代码中替换三件事,如下所示:

RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(this,lstBook);

RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getActivity(),lstBook);

public class RecyclerViewAdapter extends RecyclerView.Adapter {

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

从(从下面的两个构造函数替换为一个)

public RecyclerViewAdapter(Context mContext, List<Book> mData) {
    this.mContext = mContext;
    this.mData = mData;
}

public RecyclerViewAdapter(TimeFragment timeFragment, List<Book> lstBook) {
}

public RecyclerViewAdapter(Context mContext, List<Book> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

0
投票
public class TimeFragment extends Fragment {

    List<Book> lstBook ;

    public TimeFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        lstBook = new ArrayList<>();
        lstBook.add(new Book("The Vegitarian","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("The Wild Robot","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("Maria Semples","Categorie Book","Description book",R.drawable.ic_launcher_background));
        lstBook.add(new Book("The Martian","Categorie Book","Description book",R.drawable.ic_launcher_background));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_time, container, false);

        RecyclerView myrv = (RecyclerView) view.findViewById(R.id.recyclerview_id);
        RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getContext(),lstBook);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 2);
        myrv.setLayoutManager(gridLayoutManager);
        myrv.setAdapter(myAdapter);
        return view;
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.