Jessica Clark
Jessica Clark

Reputation: 1

RecyclerView not showing Data in Fragment

Someone please help!! I have searched so many questions and anwsers, moved the adapter around the onCreateView and onCreate, nothing works!! I believe the issue is in my Gallery Fragment:

GalleryFragment.java.

public class GalleryFragment extends Fragment {
    private FragmentGalleryBinding binding;

    View v;
    RecyclerView recyclerView;
    List<Hero> heroList;
    final String URL_GET_DATA = "https://simplifiedcoding.net/demos/marvel/";
private HeroAdapter adapter;

public GalleryFragment() {
}
@Nullable
@Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    FragmentGalleryBinding binding = FragmentGalleryBinding.inflate(inflater, container, false);

    View root = binding.getRoot();
    recyclerView = root.findViewById(R.id.recyclerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(adapter);

    heroList = new ArrayList<>();
    // notify adapter
    adapter.notifyDataSetChanged();




    return binding.getRoot();
  }





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


    loadHeroes();
}

    private void loadHeroes() {
        StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_GET_DATA,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            JSONArray jsonArray = new JSONArray(response);

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject obj = jsonArray.getJSONObject(i);

                                Hero hero = new Hero(
                                        obj.getString("name"),
                                        obj.getString("realname"),
                                        obj.getString("team"),
                                        obj.getString("firstappearance"),
                                        obj.getString("createdby"),
                                        obj.getString("publisher"),
                                        obj.getString("imageurl"),
                                        obj.getString("bio")
                                );

                                heroList.add(hero);
                            }




                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }
}


fragment_gallery.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        />

</LinearLayout>

HeroAdapter.java

public class HeroAdapter extends RecyclerView.Adapter<HeroAdapter.HeroViewHolder> {


   private List<Hero> heroList;
  private Context mContext;

    private static int currentPosition = 0;

    public HeroAdapter(List<Hero> heroList, Context mContext){
        this.heroList = heroList;
        this.mContext = mContext;

    }

    @Override
    public HeroViewHolder onCreateViewHolder(@NonNull  ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.fragment_gallery, parent, false);
        return new HeroViewHolder(view);
    }






    @Override
    public void onBindViewHolder(final HeroViewHolder holder, final int position) {
        Hero hero = heroList.get(position);
        holder.textViewName.setText(hero.getName());
        holder.textViewRealName.setText(hero.getRealName());
        holder.textViewTeam.setText(hero.getTeam());
        holder.textViewFirstAppearance.setText(hero.getFirstAppearance());
        holder.textViewCreatedBy.setText(hero.getCreatedBy());
        holder.textViewPublisher.setText(hero.getPublisher());
        holder.textViewBio.setText(hero.getBio().trim());

        Glide.with(mContext).load(hero.getImageUrl()).into(holder.imageView);
        holder.linearLayout.setVisibility(View.GONE);

        //if the position is equals to the item position which is to be expanded
        if (currentPosition == position) {
            //creating an animation
            Animation slideDown = AnimationUtils.loadAnimation(mContext, R.anim.slide_down);

            //toggling visibility
            holder.linearLayout.setVisibility(View.VISIBLE);

            //adding sliding effect
            holder.linearLayout.startAnimation(slideDown);
        }

        holder.textViewName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //getting the position of the item to expand it
                currentPosition = position;

                //reloding the list
                notifyDataSetChanged();
            }
        });
    }
    @Override
    public int getItemCount () {
        return heroList.size();

    }
    public class HeroViewHolder extends RecyclerView.ViewHolder {
        TextView textViewName, textViewRealName, textViewTeam, textViewFirstAppearance,
                textViewCreatedBy, textViewPublisher, textViewBio;
        ImageView imageView;
        LinearLayout linearLayout;

        HeroViewHolder(View itemView) {
            super(itemView);

            textViewName = itemView.findViewById(R.id.textViewName);
            textViewRealName = itemView.findViewById(R.id.textViewRealName);
            textViewTeam = itemView.findViewById(R.id.textViewTeam);
            textViewFirstAppearance = itemView.findViewById(R.id.textViewFirstAppearance);
            textViewCreatedBy = itemView.findViewById(R.id.textViewCreatedBy);
            textViewPublisher = itemView.findViewById(R.id.textViewPublisher);
            textViewBio = itemView.findViewById(R.id.textViewBio);
            imageView = itemView.findViewById(R.id.imageView);

            linearLayout = itemView.findViewById(R.id.linearLayout);
        }
    }

Expecting for the HeroList to display in Gallery Fragment the Drawer works however the table data does not display!

Upvotes: 0

Views: 64

Answers (1)

Jay
Jay

Reputation: 3472

There seems to be 2 caveats, at first glance, in your GalleryFragment:

  1. Missing initialization of adapter object inside onCreateView() method:
// init recyclerview
...

// create empty list for heroes
heroList = new ArrayList<>();

// adapter.notifyDataSetChanged(); -- Remove this call here

// init the adapter for heroes
adapter = new HeroAdapter(heroList, requireContext());

// set the adapter to recyclerview
recyclerView.setAdapter(adapter);
  1. You need to call adapter.notifyDataSetChanged(); once your API call succeeds and the heroList is added with items:
@Override
public void onResponse(String response) {
    try {
        // parse string response and add `hero` objects inside `heroList`
        ...
        heroList.add(ob);

        // notify the adapter that data set,i.e. `heroList` has changed
        adapter.notifyDataSetChanged();
     }
}

Upvotes: 1

Related Questions