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

时间:2019-08-13 21:01:15

标签: java android androidx

这是我的回收视图适配器

CategoryAdapter类

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

这是我的模特

食品课

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

我的棉绒活动

CategoryActivity类

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

我不知道代码有什么问题,回收视图还没有工作,它没有显示任何项目,如果有人可以帮助我并发现我的代码有问题,我将非常感激

2 个答案:

答案 0 :(得分:1)

在查询完成的回调中调用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");

答案 1 :(得分:0)

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

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