如何使RecyclerView显示项目



我真的很难理解RecyclerView是如何工作的。我已经制作了适配器和它的主要代码,但它什么都没有显示。

我已经尝试了几件事,但都不起作用,因为我不知道自己在做什么。此外,我已经为它做了自定义布局,所以如果可能的话,我想使用

一点编辑:

我还检查了Postman中的php代码,看看这是否是问题所在,一切都很顺利,我得到了我需要的所有数据,所以问题出在android代码上。这是适配器:

package com.example.create4me;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import org.w3c.dom.Text;
import java.util.ArrayList;
class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private ArrayList<CardItem> data;
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView title;
public TextView price;
public ImageView image;
public ViewHolder(View itemView){
super(itemView);
title = (TextView) itemView.findViewById(R.id.cardLayoutTitle);
price = (TextView) itemView.findViewById(R.id.cardLayoutPrice);
image = (ImageView) itemView.findViewById(R.id.cardLayoutImage);
}
}
public RecyclerAdapter(ArrayList<CardItem> arr){
data = arr;
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
// Inflate the custom layout
View cardView = inflater.inflate(R.layout.cardlayout, parent, false);
// Return a new holder instance
ViewHolder viewHolder = new ViewHolder(cardView);
return viewHolder;
}
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int pos){
CardItem item = data.get(pos);
TextView title = holder.title;
TextView price = holder.price;
ImageView image = holder.image;
title.setText(data.get(pos).getTitle());
price.setText(data.get(pos).getPrice());
/**
image.setImageBitmap(data.get(pos).getImage());
**/
}
public int getItemCount(){
return data.size();
}

}

这是主页片段:

package com.example.create4me;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class Home extends Fragment {
TextView text;
RecyclerView container;
RecyclerAdapter adapter;
ArrayList<CardItem> arr = new ArrayList<>();
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
container = view.findViewById(R.id.homeContainer);
adapter = new RecyclerAdapter(arr);
container.setAdapter(adapter);
container.setLayoutManager(new LinearLayoutManager(getContext()));
loaditems();
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
return inflater.inflate(R.layout.home, container, false);
}
void loaditems(){
String url = "http://192.168.108.2/createdb/GetAllOffers.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);
JSONObject jsonResponse = jsonArray.getJSONObject(0);
JSONArray jsonArray_users = jsonResponse.getJSONArray("offers");
for (int i = 0; i < jsonArray_users.length(); i++) {
JSONObject jsonObject = jsonArray_users.getJSONObject(i);
arr.add(new CardItem(jsonObject.getString("title"),
jsonObject.getString("desc"),
jsonObject.getString("price"),
jsonObject.getString("madeby"),
jsonObject.getString("uuid")));
}
adapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
text.setText(error.getMessage().toString());
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
}

这是CardItem类:

package com.example.create4me;
import android.content.Intent;
public class CardItem {
//private int mImageResource;
private String title, desc, price, madeby, uuid;
public CardItem(
String title,
String desc,
String price,
String madeby,
String uuid){
//this.mImageResource = image;
this.title = title;
this.desc = desc;
this.price = price;
this.madeby = madeby;
this.uuid = uuid;
}
public String getUuid(){
return this.uuid;
}
/**
public int getImage(){
return this.mImageResource;
}
**/
public String getTitle(){
return this.title;
}
public String getDesc(){
return this.desc;
}
public String getPrice(){
return this.price;
}
public String getMadeby(){return this.madeby;}
}

在向arr添加新的CardItem后调用adapter.notifyDataSetChanged();,您可能还想在onViewCreated()中调用loaditems();,以避免任何其他问题

为了显示新项目,您需要通知适配器已附加新数据。为此,您应该以以下方式通知您的适配器:

adapter.notifyDataSetChanged();

在您的特定情况下,您需要在填充声明的ArrayList<CardItem>的for循环之后执行此操作

for (int i = 0; i < jsonArray_users.length(); i++) {
// here populate arr with items
}
// notify adapter about new items
adapter.notifyDataSetChanged();
  1. onViewCreatedMethod结束时调用loadItems方法。

  2. 您应该在适配器中添加一个方法来更改数据,然后调用notifyDataSetChanged()。遵循以下代码:

public void setData(ArrayList<CardItem> data){
this.data = data;
notifyDataSetChanged();
}
  1. 在您的片段中添加arr中的项目后(for循环后(调用上述方法。如下所示:

adapter.setData(arr);

最后的适配器代码是:

class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private ArrayList<CardItem> data;
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView title;
public TextView price;
public ImageView image;
public ViewHolder(View itemView){
super(itemView);
title = (TextView) itemView.findViewById(R.id.cardLayoutTitle);
price = (TextView) itemView.findViewById(R.id.cardLayoutPrice);
image = (ImageView) itemView.findViewById(R.id.cardLayoutImage);
}
}
public RecyclerAdapter(ArrayList<CardItem> arr){
data = arr;
}
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
// Inflate the custom layout
View cardView = inflater.inflate(R.layout.cardlayout, parent, false);
// Return a new holder instance
ViewHolder viewHolder = new ViewHolder(cardView);
return viewHolder;
}
public void onBindViewHolder(RecyclerAdapter.ViewHolder holder, int pos){
CardItem item = data.get(pos);
TextView title = holder.title;
TextView price = holder.price;
ImageView image = holder.image;
title.setText(data.get(pos).getTitle());
price.setText(data.get(pos).getPrice());
/**
image.setImageBitmap(data.get(pos).getImage());
**/
}
public int getItemCount(){
return data.size();
}
public void setData(ArrayList<CardItem> data){
this.data = data;
notifyDataSetChanged();
}
}

最后的片段代码是:

public class Home extends Fragment {
TextView text;
RecyclerView container;
RecyclerAdapter adapter;
ArrayList<CardItem> arr = new ArrayList<>();
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
container = view.findViewById(R.id.homeContainer);
adapter = new RecyclerAdapter(arr);
container.setAdapter(adapter);
container.setLayoutManager(new LinearLayoutManager(getContext()));
loaditems();
}
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
return inflater.inflate(R.layout.home, container, false);
}
void loaditems(){
String url = "http://192.168.108.2/createdb/GetOffer.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);
JSONObject jsonResponse = jsonArray.getJSONObject(0);
JSONArray jsonArray_users = jsonResponse.getJSONArray("offers");
for (int i = 0; i < jsonArray_users.length(); i++) {
JSONObject jsonObject = jsonArray_users.getJSONObject(i);
arr.add(new CardItem(jsonObject.getString("title"),
jsonObject.getString("desc"),
jsonObject.getString("pack1title"),
jsonObject.getString("pack2title"),
jsonObject.getString("pack3title"),
jsonObject.getString("pack1desc"),
jsonObject.getString("pack2desc"),
jsonObject.getString("pack3desc"),
jsonObject.getString("pack1price"),
jsonObject.getString("pack2price"),
jsonObject.getString("pack3price"),
jsonObject.getString("uuid")));
text.setText(arr.get(0).getTitle().toString());
}
adapter.setData(arr);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
text.setText(error.getMessage().toString());
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
}
显然我找到了答案。首先,向那些让我添加在CCD_ 13循环之后的CCD_。

其次,显然我的数据是错误的,而不是

arr.add(new CardItem(jsonObject.getString("title"),
jsonObject.getString("desc"),
jsonObject.getString("price"),
jsonObject.getString("madeby"),
jsonObject.getString("uuid")));

我应该写

arr.add(new CardItem(jsonObject.getString("title"),
jsonObject.getString("description"),
jsonObject.getString("price"),
jsonObject.getString("madeby"),
jsonObject.getString("belongto")));

有点像我的错误。但感谢所有试图提供帮助的人!

有了以上所有更改,也可以尝试添加容器hasFixedSize(true(;家庭碎片。我认为它应该正常工作

最新更新