Reputation: 1
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
Reputation: 3472
There seems to be 2 caveats, at first glance, in your GalleryFragment
:
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);
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