java - 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();
}
}
解决方案
在您的 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 数组的大小。
推荐阅读
- javascript - 为什么表单的 onsubmit 函数只调用一次?
- java - 如何解决此 One-hot 编码错误“所有输入数组必须具有相同的形状”
- java - 创建公共图书馆时有没有办法摆脱“未使用”和“MemberVisibilityCanBePrivate”
- image - 从 API 渲染视频/图像在 react native 它显示空白空间用于不可用的东西,如视频或图像
- javascript - 组合对象数组,组合具有相同值的键并保持唯一值
- podman - 从容器内部访问主机
- r - DistributionS4 R 软件包
- python - 使用anytree模块在python中创建动态树
- c# - 如何通过 POST 调用将文件上传到外部 API
- machine-learning - Keras 中的神经网络预测为不同的输入返回相同的值