【问题标题】:No Data in Recycler View in FragmentFragment 的 Recycler 视图中没有数据
【发布时间】:2020-02-11 11:02:46
【问题描述】:

我正在构建一个具有选项卡布局的 Android 应用程序,其中有片段,并且在片段中我显示了一些值。 我刚刚添加了硬编码值来测试布局,但即使这些值在片段中也不可见。

ViewPagerAdapter 的代码如下:

public class FavouriteViewPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> favouriteFragmentList = new ArrayList<>(); // this line can cause crashes
    private final List<String> favouriteFragmentListTitles = new ArrayList<>();


    public FavouriteViewPagerAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return favouriteFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return favouriteFragmentListTitles.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return favouriteFragmentListTitles.get(position);
    }

    public void AddFragment(Fragment fragment, String title) {
        favouriteFragmentList.add(fragment); // this line can cause crashes
        favouriteFragmentListTitles.add(title);
    }
}

我已经尝试了可用的答案,但没有一个能解决我的问题。 我调试了应用程序,我的 RecyclerViewAdapter 甚至没有被调用,很奇怪。我已经这样做了很多次,但这从未发生过。 这是我的 RecyclerViewAdapter 代码:

public class ProductsRecyclerAdapter extends RecyclerView.Adapter<ProductsRecyclerAdapter.viewHolder> {

    Context context;
    private List<FavouriteProducts> favouriteProductsData;

    public ProductsRecyclerAdapter(Context context, List<FavouriteProducts> favouriteProductsData) {
        this.context = context;
        this.favouriteProductsData = favouriteProductsData;
    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.single_favourite_product_item, parent, false);
        viewHolder vHolder = new viewHolder(v);
        return vHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull viewHolder holder, int position) {

        holder.product_name.setText(favouriteProductsData.get(position).getProduct_name());
        holder.product_price.setText(favouriteProductsData.get(position).getProduct_price());
        holder.product_image.setImageResource(favouriteProductsData.get(position).getProduct_image());
        Toast.makeText(context,favouriteProductsData.get(position).getProduct_price() , Toast.LENGTH_SHORT).show();
        /*holder.heart_button.setOnLikeListener(new OnLikeListener() {
            @Override
            public void liked(LikeButton likeButton) {
                showSuccessToast(context,"Liked");
            }

            @Override
            public void unLiked(LikeButton likeButton) {
                showSuccessToast(context,"Unliked");
            }
        });*/

    }

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

    static class viewHolder extends RecyclerView.ViewHolder {

        MaterialTextView product_name, product_price;
        ImageView product_image;
        LikeButton heart_button;

        public viewHolder(@NonNull View itemView) {
            super(itemView);
            product_name = itemView.findViewById(R.id.product_name);
            product_price = itemView.findViewById(R.id.product_price);
            product_image = itemView.findViewById(R.id.product_image);
            heart_button = itemView.findViewById(R.id.heart_button);

        }
    }
}

我没有收到任何错误,但是在我检查适配器之后甚至没有调用。一些帮助会很有帮助。

片段代码:

public class FavouriteProductsFragment extends Fragment {

    View v;
    private List<FavouriteProducts> productList;

    public FavouriteProductsFragment() {
    }


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        productList = new ArrayList<>();
        productList.add(new FavouriteProducts("All Weather", "200/Ltr", R.drawable.all_weather));
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.products_favourite_fragment, container, false);
        RecyclerView productRecyclerView = v.findViewById(R.id.favourite_products_rv);
        ProductsRecyclerAdapter recyclerAdapter = new ProductsRecyclerAdapter(getContext(), productList);
        productRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        productRecyclerView.hasFixedSize();
        productRecyclerView.setAdapter(recyclerAdapter);
        return v;
    }

}

【问题讨论】:

    标签: android android-fragments android-recyclerview android-tablayout


    【解决方案1】:
    productList = new ArrayList<>();
    productList.add(new FavouriteProducts("All Weather", "200/Ltr",R.drawable.all_weather));
    recyclerAdapter.notifyDataSetChanged()
    RecyclerView productRecyclerView = v.findViewById(R.id.favourite_products_rv);
    ProductsRecyclerAdapter recyclerAdapter = new ProductsRecyclerAdapter(getContext(), productList);
    productRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    productRecyclerView.hasFixedSize();
    productRecyclerView.setAdapter(recyclerAdapter);
    

    【讨论】:

    • 你需要先在list中添加数据。在recyclerview中设置之后才不会出现空指针异常。
    • 仍然没有调用相同的 RecyclerViewDapter 方法,没有错误
    【解决方案2】:

    你需要添加

    RecyclerView productRecyclerView = v.findViewById(R.id.favourite_products_rv);
    ProductsRecyclerAdapter recyclerAdapter = new ProductsRecyclerAdapter(getContext(), productList);
    productRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    productRecyclerView.hasFixedSize();
    productRecyclerView.setAdapter(recyclerAdapter);
    productList = new ArrayList<>();
    productList.add(new FavouriteProducts("All Weather", "200/Ltr",R.drawable.all_weather));recyclerAdapter.notifyDataSetChanged()
    

    并移除 oncreate() 方法

    【讨论】:

    • 您的意思是删除 oncreate() 并将其添加到 onCreateView() 中?
    • 这给了我在 getItemCount() 中的 NullPointerException
    • 初始化私有列表 productList = new ArrayList() 全局@HasnainGhias
    • 还是没有运气,兄弟
    【解决方案3】:

    试试 productRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));在 recyclerview 中设置适配器之前。

    【讨论】:

    • 感谢您的努力,但仍然没有运气
    【解决方案4】:

    第 1 步:首先为您的 ViewPager 创建一个或多个片段,并在此片段中根据您的要求添加您的 Recyclerview 代码。

    喜欢下面的代码

      @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        // Inflate the layout for this fragment
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_whatsapp_image, container, false);
        context = getActivity();
        ((HomeActivity) getActivity()).toolbar.setVisibility(View.VISIBLE);
        setupView(root);
        return root;
    }
    
    private void setupView(ViewGroup root) {
        recyclerView = (RecyclerView) root.findViewById(R.id.recyclerViewImage);
        progressBar=root.findViewById(R.id.simpleProgressBar);
        txtinfo=root.findViewById(R.id.txtinfo);
            setUPList();
    
    }
    

    第二步:然后为你的 TabLayout 创建 ViewPager 适配器

    public class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }
    
        @Override
        public Fragment getItem(int position) {
            if(position == 0) return new AudioFragment();
            if(position == 1) return new VideoFragment();
            if(position == 2) return new ImageFragment();
    
            throw new IllegalStateException("Unexpected position " + position);
        }
    
        @Override
        public int getCount() {
            return 3;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            if(position == 0) return "Audio";
            if(position == 1) return "Video";
            if(position == 2) return "Image";
          
            throw new IllegalStateException("Unexpected position " + position);
        }
    }
    

    第 3 步:然后在 Activity 的 Oncreate 方法中调用 SetupViewpager 方法

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        toolbar=findViewById(R.id.toolbar);
        viewPager=findViewById(R.id.viewpager);
        tabLayout=findViewById(R.id.tabs);
    
        //add toolbar
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            setupViewPager(viewPager);
    
            tabLayout.setupWithViewPager(viewPager);
            setTabIcons();
    }
    

    注意:您可以从以下链接下载 ViewPager 代码。Click Here to View and Download

    【讨论】:

    • 我已经完成了所有这些,但仍然无法显示数据。即使我的相同代码适用于其他应用程序
    • 将放置您的活动代码,因为我想检查天气您在活动中加载您的 FavouriteViewPagerAdapter。
    • viewPagerAdapter = new FavouriteViewPagerAdapter(getSupportFragmentManager()); viewPagerAdapter.AddFragment(new FavouriteProductsFragment(), "PRODUCT"); viewPagerAdapter.AddFragment(new FavouriteVendorFragment(), "VENDOR"); viewPagerAdapter.AddFragment(new FavouriteProfessionalFragment(), "PROFESSIONAL"); favourite_viewpager.setAdapter(viewPagerAdapter); favourite_tabs_layout.setupWithViewPager(favourite_viewpager);
    • 你可以在这里查看整个代码,bitbucket.org/fiazsial/welist-android-app/src/master
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多