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

时间:2018-05-28 01:33:37

标签: android android-fragments android-recyclerview recycler-adapter android-cardview

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

因为我在片段中使用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;
    }
}

4 个答案:

答案 0 :(得分:0)

您的片段未传递任何上下文。您正在传递 this ,这是TimeFragment,因此正在调用的构造函数是

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

请改用活动上下文。

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

答案 1 :(得分: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){
        }

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

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

    希望能帮助并消除疑虑。

答案 2 :(得分: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> {

从(从两个构建者替换为一个作为Bellow)

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

答案 3 :(得分: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;
    }

}