首页 > 解决方案 > RecycleView 调用 onBindViewHolder() 和 onCreateViewHolder()

问题描述

这是我的代码我不知道为什么它现在不起作用歌曲是一个简单的Java类,其中包含getter setter

在从中获取数据之前,JSON我尝试在 recycleView 中静态添加数据,并且效果很好。

这是代码,

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

使用 volley 解析 JSON 的代码

  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 类

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

}

标签: javaandroid

解决方案


在您的 onBindViewHolder 中,更改以下代码

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

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

到以下

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

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

在您的代码中,您尝试使用类名访问 textview。相反,您应该使用该holder变量。

另外请检查您是否正确解析了 json。检查是否

data.add(item);

在 api 响应中被执行。另一个建议是在适配器构造函数中检查 dataSet 数组的大小。


推荐阅读