Android Retrofit 2:从另一个 Activity 刷新 Recyclerview

Andriod Retrofit 2: Refreshing Recycler View From from another Activity

所以我有一个应用程序,我在其中使用 Recycler View 显示数据库中的产品列表。 每个项目旁边都有删除按钮,工作正常。 还有一个扫描项目按钮,它打开一个条形码扫描仪,扫描成功后将新产品添加到数据库并返回到 Recycler 视图显示应该刷新视图并显示新项目。

但我在添加新产品时刷新回收站视图时遇到问题。

还有一个完美运行的删除产品功能,所以我尝试以同样的方式执行添加项目方法,但回收站视图没有刷新。

用户页面activity

    public class UserPage extends AppCompatActivity implements ProductAdaptar.clickedItem {
    Toolbar toolbar;
    RecyclerView recyclerView;
    String rfidNo;
    public static String barcode;
    Button scanItem;
    Button payBill;
    TextView total;
    ProductAdaptar productAdaptar;
    Call<List<UserLoginResp>> productList;
    List<UserLoginResp> productListsItems = new ArrayList<>();


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_page);
        toolbar=findViewById(R.id.toolbar);
        recyclerView=findViewById(R.id.recyclerview);
        scanItem = findViewById(R.id.scanItem);
        payBill = findViewById(R.id.payBill);
        total = findViewById(R.id.total);

        scanItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startActivity(new Intent(getApplicationContext(),ScannerView.class).putExtra("rfid",rfidNo));
            }
        });

        payBill.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkout();
            }
        });

        LinearLayoutManager manager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(manager);
        recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        productAdaptar = new ProductAdaptar(this::clickedItem, this);

        Intent intent =getIntent();
        if(intent.getExtras()!=null){
            rfidNo= intent.getStringExtra("rfid");
        }
        getAllProducts(rfidNo);
        }
        public void getAllProducts(String rfidno){
            LinearLayoutManager manager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(manager);
            productAdaptar = new ProductAdaptar(this::clickedItem,this);
            productList= ApiClient.getUserPageService().getCartItems(rfidno);
            productList.enqueue(new Callback<List<UserLoginResp>>() {
                @Override
                public void onResponse(Call<List<UserLoginResp>> call, Response<List<UserLoginResp>> response) {
                    if (response.isSuccessful()) {
                        productListsItems = response.body();
                        productAdaptar.setData(productListsItems);
                        RecyclerView recyclerView = findViewById(R.id.recyclerview);
                        recyclerView.setAdapter(productAdaptar);
                        getTotal();
                    }
                }
                @Override
                public void onFailure(Call<List<UserLoginResp>> call, Throwable t) {
                    Log.e("listfailed",t.getLocalizedMessage());
                }
            });
    }

    public void getTotal(){
            Call<getBill> bill = ApiClient.getUserPageService().getBill(rfidNo);
            bill.enqueue(new Callback<getBill>() {
                @Override
                public void onResponse(Call<getBill> call, Response<getBill> response) {
                    if(response.isSuccessful()){
                        getBill getBill = response.body();
                        String bill = String.valueOf(getBill.getBill());
                        total.setText(bill);
                    }
                }

                @Override
                public void onFailure(Call<getBill> call, Throwable t) {
                    Log.e("bill error",""+t);
                }
            });
}

public void checkout(){
    Call<String> payment= APIClientString.getUserPageService().checkout(rfidNo);
    payment.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            if(response.isSuccessful()){
                getAllProducts(rfidNo);
                Toast.makeText(UserPage.this, "Payment Successful", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
                Log.e("paymentfail",""+t);
        }
    });
}


@Override
public void clickedItem(UserLoginResp userLoginResp) {
        Log.e("clicked prodcut", userLoginResp.toString());
}

}

扫描仪视图Class

enter @Override
public void handleResult(Result rawResult) {
    barcode = rawResult.getText();
    if(addItem(barcode,rfidNo)) {
        userPage.getAllProducts(rfidNo);
    }
    onBackPressed();
} 
public boolean addItem(String barcode,String rfidNo){
    final boolean[] res = {false};
    Call<String> resp = APIClientString.getUserPageService().addProduct(barcode,rfidNo);
    resp.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            if(response.isSuccessful()){
                Toast.makeText(ScannerView.this, response.body().toString(), Toast.LENGTH_SHORT).show();
                res[0] =true;
            }
        }

这是扫描仪 class,它应该从 UserPage Activity 调用 getAllproducts 函数来刷新视图。它没有显示错误,但回收站视图没有更新。

这是适配器Class

public class ProductAdaptar extends RecyclerView.Adapter<ProductAdaptar.ProductAdaptarVH> {

private List<UserLoginResp> productListItems;
private UserPage context;
private clickedItem clickedItem;

public ProductAdaptar(clickedItem clickedItem, UserPage activity) {
    this.clickedItem = clickedItem;
    this.context= activity;
}

public void setData(List<UserLoginResp> productListItems) {
    this.productListItems = productListItems;
    notifyDataSetChanged();
}

@NonNull
@Override
public ProductAdaptarVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    return new ProductAdaptar.ProductAdaptarVH(LayoutInflater.
            from(context).inflate(R.layout.row_products,parent,false));
}

@Override
public void onBindViewHolder(@NonNull ProductAdaptarVH holder, int position) {
    UserLoginResp userLoginResp = productListItems.get(position);
    String pName = userLoginResp.getProductName();
    String pQuan = userLoginResp.getQuantity();
    String pPrice = userLoginResp.getProductPrice();
    String pBarcode = userLoginResp.getProductID();
    String userID = userLoginResp.getUserID();
    holder.pName.setText(pName);
    holder.pQuan.setText(pQuan);
    holder.pPrice.setText(pPrice);
    holder.delProdcut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            delProduct(userID,pBarcode);
        }
    });
    holder.moreDetails.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

}
public interface clickedItem{
    public void clickedItem(UserLoginResp userLoginResp);
}

public void delProduct(String userID, String pBarcode){
    Call<String> res = APIClientString.getUserPageService().deleteProduct(pBarcode,userID);
    res.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            if(response.isSuccessful()){
                Toast.makeText(context, response.body().toString(), Toast.LENGTH_SHORT).show();
                context.getAllProducts(userID);
            }
        }
        @Override
        public void onFailure(Call<String> call, Throwable t) {
                Log.e("deletefailed",""+t);
        }
    });
}

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

public static class ProductAdaptarVH extends RecyclerView.ViewHolder {

    TextView pName;
    TextView pQuan;
    TextView pPrice;
    Button delProdcut;
    Button moreDetails;

    public ProductAdaptarVH(@NonNull View itemView) {
        super(itemView);
         pName=itemView.findViewById(R.id.pName);
         pQuan=itemView.findViewById(R.id.pQuantity);
         pPrice=itemView.findViewById(R.id.pPrice);
         delProdcut=itemView.findViewById(R.id.delProduct);
         moreDetails=itemView.findViewById(R.id.moreDetails);
    }
}

}

在这个产品适配器中有一个删除产品项目的功能

holder.delProdcut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            delProduct(userID,pBarcode);
        }
    });
    public void delProduct(String userID, String pBarcode){
    Call<String> res = APIClientString.getUserPageService().deleteProduct(pBarcode,userID);
    res.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            if(response.isSuccessful()){
                Toast.makeText(context, response.body().toString(), Toast.LENGTH_SHORT).show();
                context.getAllProducts(userID);
            }
        }
        @Override
        public void onFailure(Call<String> call, Throwable t) {
                Log.e("deletefailed",""+t);
        }
    });
}

它还从 UserPage activity 调用 getProduts 函数,它工作得很好,但 AddItem 函数不刷新视图。

Retrofit API 也完全正常工作,问题仅在于刷新 Item Add 上的回收视图显示。

我是 android 编码的新手,所以我似乎不明白该怎么做。

当您使用 getAllProducts() 方法刷新适配器时,它在 onCreate() 中被调用。现在,无论何时启动 ScannerView activity,UserPage activity 都会暂停,然后在 ScannerView activity 完成时启动(未创建)。因此,您应该在 onStart() 方法中调用 getAllProducts(),如下所示:

    @Override
    protected void onStart() {
        super.onStart();

        Intent intent = getIntent();
        if (intent.getExtras() != null) {
            rfidNo = intent.getStringExtra("rfid");
        }

        getAllProducts(rfidNo);
    }