1
votes

Aucune donnée dans la vue Recycleur dans le fragment

Je suis en train de créer une application Android qui a une disposition d'onglets dans laquelle il y a des fragments et dans Fragment j'affiche une valeur. Je viens juste d'ajouter des valeurs codées en dur pour tester la mise en page, mais même celles-ci ne sont pas visibles dans le fragment.

Voici le code de ViewPagerAdapter:

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

}

J'ai essayé les réponses disponibles déjà aucune d'elles ne résout mon problème. J'ai débogué l'application et mon RecyclerViewAdapter n'est même pas appelé, très étrange. J'ai fait cela plusieurs fois mais cela n'est jamais arrivé. Voici mon code pour 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);

        }
    }
}

Je n'obtiens aucune erreur mais après avoir vérifié l'adaptateur n'est même pas appelé. Une aide sera vraiment utile.

Fragment Code:

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


0 commentaires

4 Réponses :


1
votes

Vous devez ajouter

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()

et supprimer la méthode oncreate ()


4 commentaires

Vous voulez supprimer oncreate () et l'ajouter dans onCreateView ()?


Cela me donne NullPointerException dans getItemCount ()


Initialiser la liste privée productList = new ArrayList <> () globalement @HasnainGhias


Toujours pas de chance bro



2
votes
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);

2 commentaires

vous devez d'abord ajouter des données dans list.after set dans le recyclerview afin de ne pas obtenir d'exception de pointeur nul.


Les mêmes méthodes RecyclerViewDapter ne sont pas appelées sans erreur



1
votes

essayez productRecyclerView.setLayoutManager (new LinearLayoutManager (getActivity ())); avant de définir l'adaptateur dans Recyclerview.


1 commentaires

Merci pour l'effort mais toujours pas de chance



0
votes

Étape 1: Commencez par créer un ou plusieurs fragments pour votre ViewPager et dans ce fragment, ajoutez votre code Recyclerview selon vos besoins.

Comme le code ci-dessous

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

Étape 2: Créez ensuite un adaptateur ViewPager pour votre mise en page d'onglet

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

Étape 3: Appelez ensuite votre Méthode SetupViewpager dans votre méthode Oncreate de votre activité

  @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();

}

REMARQUE: vous pouvez télécharger le code ViewPager à partir du lien ci-dessous. Cliquez ici pour afficher et télécharger


4 commentaires

J'ai fait tout cela mais toujours pas de chance avec l'affichage des données. Même si mon même code fonctionne pour une autre application


mettra votre code d'activité car je veux vérifier si vous chargez votre adaptateur ViewPager préféré en activité.


viewPagerAdapter = nouveau FavouriteViewPagerAdapter (getSupportFragmentManager ()); viewPagerAdapter.AddFragment (nouveau FavouriteProductsFragment (), "PRODUCT"); viewPagerAdapter.AddFragment (nouveau FavouriteVendorFragment (), "VENDOR"); viewPagerAdapter.AddFragment (nouveau FavouriteProfessionalFragment (), "PROFESSIONAL"); favourite_viewpager.setAdapter (viewPagerAdapter); favourite_tabs_layout.setupWithViewPager (favourite_viewpager‌);


Vous pouvez voir l'intégralité du code ici, bitbucket.org/fiazsial/welist-android -app / src / master