【问题标题】:How to run my RecyclerView with CardView in fragment?如何在片段中使用 CardView 运行我的 RecyclerView?
【发布时间】:2018-05-28 01:33:37
【问题描述】:

我有这段代码,每次我尝试运行它..应用程序没有运行不是错误但没有运行任何人都可以帮助我确定出现这种问题的原因。

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


【解决方案1】:

实际上有两种方法。

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 的代码即可。

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

}

希望能帮助并消除疑虑。

【讨论】:

    【解决方案2】:

    没有从您的片段传递上下文。您正在传递 this 这是 TimeFragment 所以被调用的构造函数是

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

    改用活动上下文。

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

    【讨论】:

      【解决方案3】:

      将代码中的三件事替换如下:

      来自

      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> {
      

      From(从 tow consturcter 替换为一个为 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;
          }
      

      【讨论】:

        【解决方案4】:
        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;
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多