2
Whoa, guys, I’m pulling a list from the server and populating a RecyclerView
with that list. But when the list is empty, I want a message like: "There are no entries for that product yet". But not a Toast
, and yes a fixed message in a TextView
. Can someone help me?
Thanks
public class ProductAdminActivity extends AppCompatActivity {
public static final String APP_NAME = "PanApp";
public static final String URL = "https://panapp-backend.appspot.com/_ah/api";
private RecyclerView rvProductAdmin;
private Button btnNewProduct;
private Long bakeryId;
private Bundle params;
private TextView txtAnswer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getLayoutInflater().inflate(R.layout.activity_product_admin, frameLayout);
setContentView(R.layout.activity_product_admin);
setTitle("Meus Produtos");
Intent it = getIntent();
params = it.getExtras();
if (params != null) {
bakeryId = params.getLong("bakeryId");
}
txtAnswer = (TextView) findViewById(R.id.textAnswer);
rvProductAdmin = (RecyclerView) findViewById(R.id.product_list_admin);
btnNewProduct = (Button) findViewById(R.id.btn_new_product);
btnNewProduct.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
params.putLong("bakeryId", bakeryId);
Intent intentFormProduct = new Intent(ProductAdminActivity.this, FormProductActivity.class);
intentFormProduct.putExtras(params);
startActivity(intentFormProduct);
}
});
new ProductListAsyncTask(this).execute();
}
private class ProductListAsyncTask extends AsyncTask<Void, Void, CollectionResponseProduct> {
ProductAdminActivity context;
private ProgressDialog pd;
public ProductListAsyncTask(ProductAdminActivity context) {
this.context = context;
}
protected void onPreExecute(){
super.onPreExecute();
pd = new ProgressDialog(context);
pd.setMessage("Listando Produtos...");
pd.show();
}
protected CollectionResponseProduct doInBackground(Void... unused) {
CollectionResponseProduct collectionResponseProduct = null;
try {
ProductApi.Builder builder = new ProductApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null).setRootUrl(URL);
builder.setApplicationName(APP_NAME);
ProductApi service = builder.build();
collectionResponseProduct = service.list().execute();
} catch (Exception e) {
Log.d("Erro", e.getMessage(), e);
}
return collectionResponseProduct;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
protected void onPostExecute(CollectionResponseProduct collectionResponseProduct) {
pd.dismiss();
if(collectionResponseProduct.size() > 0){
List<Product> list = new ArrayList<>();
List<Product> _list = collectionResponseProduct.getItems();
for (Product productAux : _list) {
Product product = new Product();
product.setProductName(productAux.getProductName());
product.setProductPrice(productAux.getProductPrice());
product.setType(productAux.getType());
product.setBakeryId(productAux.getBakeryId());
product.setProductImage(productAux.getProductImage());
if(Objects.equals(bakeryId, product.getBakeryId())){
list.add(product);
}
}
rvProductAdmin.setLayoutManager(new LinearLayoutManager(ProductAdminActivity.this));
rvProductAdmin.setAdapter(new ProductAdapter(list));
} else {
txtAnswer.setText("Não existem produtos cadastrados!");
}
}
}
}
Adapter:
public class ProductAdapter extends RecyclerView.Adapter<ProductViewHolder> {
private final List<Product> products;
public ProductAdapter(List<Product> products) {
this.products = products;
}
@Override
public ProductViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
final LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
final View v = layoutInflater.inflate(R.layout.card_product, viewGroup, false);
//final View v = layoutInflater.inflate(R.layout.item_product, viewGroup, false);
return new ProductViewHolder(v);
}
@Override
public void onBindViewHolder(ProductViewHolder productViewHolder, int i) {
productViewHolder.tvProductName.setText(products.get(i).getProductName());
productViewHolder.tvPrice.setText(products.get(i).getProductPrice().toString());
productViewHolder.tvCategory.setText(products.get(i).getType());
//productViewHolder.tvItensSale.setText(products.get(i).getItensSale());
String strBase64 = products.get(i).getProductImage();
byte[] imgBytes = Base64.decode(strBase64, Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(imgBytes, 0, imgBytes.length);
productViewHolder.ivProduct.setImageBitmap(bitmap);
}
@Override
public int getItemCount() {
return products.size();
}
}
Exception:
FATAL EXCEPTION: main
Process: com.gregmachado.panapp, PID: 8730
java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
at com.gregmachado.panapp.activity.ProductAdminActivity$ProductListAsyncTask.onPostExecute(ProductAdminActivity.java:106)
at com.gregmachado.panapp.activity.ProductAdminActivity$ProductListAsyncTask.onPostExecute(ProductAdminActivity.java:70)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
If you put your code here, I’ll help you!
– viana
I put the code, that Toast over there isn’t working, I don’t know if it has to do with Colletionresponse, first time I work with this kind of list.
– Grégori Machado