Как запустить мой RecyclerView с CardView во фрагменте? - PullRequest
0 голосов
/ 28 мая 2018

У меня есть этот код, и каждый раз, когда я пытался его запустить .. приложение не работает, не ошибка, но не работает, может кто-нибудь, пожалуйста, помогите мне определить причину возникновения такого рода проблемы.

потому что я делаю RecyclerView с CardView во фрагменте, у меня есть эта проблема почти неделю: (

это мой код:

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 голосов
/ 13 февраля 2019
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;
    }

}
0 голосов
/ 28 мая 2018

На самом деле есть два способа сделать это.

1.Удалите указанную ниже строку из RecyclerViewAdapter.

public RecyclerViewAdapter (TimeFragment timeFragment, List lstBook) {}

и вфрагмент кода, есть также небольшие изменения, пожалуйста, посмотрите код ниже, а также у меня не было отрисовки, поэтому я использовал по умолчанию.

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.

То, что произошло, - когда у вас есть контекст в конструкторе адаптера, вы фактически использовали второй конструктор адаптера, который принимает аргумент, как показано ниже

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 голосов
/ 28 мая 2018

Замените в своем коде три вещи следующим образом:

С

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 голосов
/ 28 мая 2018

Контекст не передается из вашего фрагмента.Вы передаете this , который является TimeFragment, поэтому вызываемый конструктор имеет значение

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

. Вместо этого используйте контекст действия.

RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(getActivity(),lstBook);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...