Androidx RecycleView 不显示带有解析服务器的项目

Androidx RecycleView Not showing items with parse server

这是我的回收视图适配器

类别适配器Class

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

private Context mcontext;
private List<Food> mData;
RequestOptions option;

public CategoryRAdapter(Context mcontext, List<Food> mData) {
    this.mcontext = mcontext;
    this.mData = mData;

    option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.food_row, parent, false);

    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Food current = mData.get(position);
    holder.tv_Name.setText(current.getName());
    holder.tv_Rating.setText(current.getRating());
    holder.tv_Descip.setText(current.getDescrip());
    holder.tv_Category.setText(current.getCateg());
    Glide.with(mcontext).load(mData.get(position).getImages()).apply(option).into(holder.img_Thumbnail);
}

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

public class MyViewHolder extends RecyclerView.ViewHolder {

    TextView tv_Name;
    TextView tv_Rating;
    TextView tv_Descip;
    TextView tv_Category;
    ImageView img_Thumbnail;

    public MyViewHolder(View itemView) {
        super(itemView);

        tv_Name = itemView.findViewById(R.id.food_name);
        tv_Rating = itemView.findViewById(R.id.rating);
        tv_Descip = itemView.findViewById(R.id.desc);
        tv_Category = itemView.findViewById(R.id.category);
        img_Thumbnail = itemView.findViewById(R.id.thumbnail);
    }
}
}

这是我的模型

食物Class

public class Food {
    String Name;
    String Images;
    String Descrip;
    String Rating;
    String Categ;

public Food() {
}

public Food(String name, String images, String descrip, String rating, String categ) {
    this.Name = name;
    this.Images = images;
    this.Descrip = descrip;
    this.Rating = rating;
    this.Categ = categ;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getImages() {
    return Images;
}

public void setImages(String images) {
    Images = images;
}

public String getDescrip() {
    return Descrip;
}

public void setDescrip(String descrip) {
    Descrip = descrip;
}

public String getRating() {
    return Rating;
}

public void setRating(String rating) {
    Rating = rating;
}

public String getCateg() {
    return Categ;
}

public void setCateg(String categ) {
    Categ = categ;
}
}

我的面activity

类别活动Class

public class CategoriaActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private List<Food> dbObjects;
private RecyclerView.Adapter adapter;
private AlertDialog.Builder dialogBuilder;
private AlertDialog dialog;
TextView l_nombre,l_precio;
Button l_finalizar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_categoria);
    recyclerView = findViewById(R.id.recycle_id);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    dbObjects = new ArrayList<>();
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Category");
    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> objList, ParseException e) {

            if (e == null) {

                for (ParseObject obj : objList) {
                    Food food = new Food();
                    food.setName(obj.getString("Name"));
                    food.setDescrip(obj.getString("Descrip"));
                    food.setRating(obj.getString("Rating"));
                    food.setCateg(obj.getString("Categ"));
                    food.setImages(obj.getString("Images"));
                    dbObjects.add(food);
                }
            } else {
                FancyToast.makeText(CategoriaActivity.this, "Error: " + e.getMessage(), FancyToast.LENGTH_SHORT, FancyToast.ERROR, true).show();
            }
        }
    });

    adapter = new CategoryRAdapter(this, dbObjects);
    recyclerView.setAdapter(adapter);

    FloatingActionButton fab = findViewById(R.id.shoppingFlot);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            carritopop();
        }
    });
}

private void carritopop() {
    dialogBuilder = new AlertDialog.Builder(this);
    View view = getLayoutInflater().inflate(R.layout.pop_cart,null);
    l_finalizar = view.findViewById(R.id.l_finalizar);
    l_finalizar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            pago();
        }
    });

    dialogBuilder.setView(view);
    dialog = dialogBuilder.create();
    dialog.show();
}

private void pago() {
    Intent intent = new Intent(CategoriaActivity.this, PagoActivity.class);
    startActivity(intent);
}
}

我不知道代码有什么问题,回收视图不工作,它不显示任何项目,如果有人能帮助我并注意到我的代码中有问题,我将不胜感激

在查询完成回调中调用 adapter.notifyDataSetChanged(),这将通知适配器列表已更改。发生这种情况是因为当您设置适配器时,列表为空,因为查询在后台 运行 。完成后,您必须告诉适配器新数据已添加到列表中:

if (e == null) {
    for (ParseObject obj : objList) {
          ...
    }
    adapter.notifyDataSetChanged();
}

此外,在发送查询之前创建您的适配器,否则它可能会导致 NullPointerException 万一数据在下一个语句执行之前被加载(极不可能,但绝对不会伤害安全)。

dbObjects = new ArrayList<>();
adapter = new CategoryRAdapter(this, dbObjects);
ParseQuery<ParseObject> query = ParseQuery.getQuery("Category");

我建议您使用 RxJava2 来使用异步方法,它很棒...关于这个问题,当您已经使用 ArrayList 创建适配器时,您的数据可能还没有准备好。

创建食物对象后,尝试将 recyclerView.setAdapter() 移动到 FindCallback 内部。