Learner
Learner

Reputation: 11

RecycleView on calling onBindViewHolder() and onCreateViewHolder()

here is my code i dont know why its not working now songs is a simple java class which contains getter setters

Before fetching data from JSON i try to statically add data in recycleView and that was working perfectly fine.

Here is code,

   public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_track, container, false);

        myOnClickListener = new track.MyOnClickListener(getActivity());
        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview1);
        //recyclerView.setHasFixedSize(true);

        layoutManager = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        loadData();

        return view;
    }

code of JSON parsing using volley

  private void loadData()
    {
        String url = "http://homejobs.live/mydata.php";
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>(){

                    @Override
                    public void onResponse(String response) {
                        try{

                            JSONArray jsonArray = new JSONArray(response);
                            Log.d("test", String.valueOf(jsonArray));
                            Log.d("test", String.valueOf(jsonArray.length()));
                            for(int i =0 ; i < jsonArray.length() ; i++)
                            {
                                JSONObject jsonObject = jsonArray.getJSONObject(i);
                                songs item = new songs(
                                        jsonObject.getString("id"),
                                        jsonObject.getString("name"),
                                        jsonObject.getString("uri")

                                );

                                Log.d("key", String.valueOf(item));

                                data.add(item);
                            }

                            adapter = new recycler_view_adapter(data);
                            recyclerView.setAdapter(adapter);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println("error"+error);
            }
        }

                );

                mRequestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
                mRequestQueue.add(stringRequest);

    }

recycler_view_adapter class

public class recycler_view_adapter extends RecyclerView.Adapter<recycler_view_adapter.MyViewHolder> {

    private ArrayList<songs> dataSet;

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        public static TextView textViewName;
        public static ImageView imageViewIcon;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.textViewName = (TextView) itemView.findViewById(R.id.textView);
            this.imageViewIcon = (ImageView) itemView.findViewById(R.id.imageView3);
        }
    }

    public recycler_view_adapter(ArrayList<songs> data) {
        this.dataSet = data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card, parent, false);

        view.setOnClickListener(track.myOnClickListener);

        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }


    @Override
    public void onBindViewHolder(final MyViewHolder holder,  final int position) {
        Log.d("hy","test");
        songs songsData = dataSet.get(position);


        MyViewHolder.textViewName.setText(songsData.getName());
        System.out.println("hello"+position);

        Picasso.get()
                .load(songsData.getImage())
                .into(MyViewHolder.imageViewIcon);
    }

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

}

Upvotes: 1

Views: 66

Answers (2)

Kailash Chouhan
Kailash Chouhan

Reputation: 2386

Try replacing onBindViewHolder with this

public void onBindViewHolder(final MyViewHolder holder,  final int position) {
    Log.d("hy","test");
    songs songsData = dataSet.get(position);


    holder.textViewName.setText(songsData.getName());
    System.out.println("hello"+position);

    Picasso.get()
            .load(songsData.getImage())
            .into(holder.imageViewIcon);
}

Upvotes: 0

Akhil Soman
Akhil Soman

Reputation: 2217

In your onBindViewHolder, change the following code

MyViewHolder.textViewName.setText(songsData.getName());
    System.out.println("hello"+position);

    Picasso.get()
            .load(songsData.getImage())
            .into(MyViewHolder.imageViewIcon);

to the following

holder.textViewName.setText(songsData.getName());
    System.out.println("hello"+position);

    Picasso.get()
            .load(songsData.getImage())
            .into(holder.imageViewIcon);

In your code, you are trying to access the textview by using the class name. Instead you should use the holder variable.

Also please check whether you are parsing the json correctly. Check if the

data.add(item);

in the api response is getting executed. Another suggestion would be to check the size of your dataSet array in the adapter constructor.

Upvotes: 1

Related Questions