这是我的购物车类。这里的每段代码都能完美运行,但只有购物车页面在应用程序运行时崩溃。我很困惑,这个错误是怎么发生的。问题出在下面这个块上。
if(session.getCartValue()>0) {
populateRecyclerView();
}
当这个方法被调用时,它就会崩溃。当购物车有一个空列表时,它工作得很好。我确定是populateRecyclerView()出了问题。但我想不出问题所在。
这是我的代码。
public class Cart extends AppCompatActivity {
//to get user session data
private UserSession session;
private HashMap<String,String> user;
private String name,email,photo,mobile;
private RecyclerView mRecyclerView;
private StaggeredGridLayoutManager mLayoutManager;
//Getting reference to Firebase Database
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference mDatabaseReference = database.getReference();
private LottieAnimationView tv_no_item;
private LinearLayout activitycartlist;
private LottieAnimationView emptycart;
private ArrayList<SingleProductModel> cartcollect;
private float totalcost=0;
private int totalproducts=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle("Cart");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
//check Internet Connection
new CheckInternetConnection(this).checkConnection();
//retrieve session values and display on listviews
getValues();
//SharedPreference for Cart Value
session = new UserSession(getApplicationContext());
//validating session
session.isLoggedIn();
mRecyclerView = findViewById(R.id.recyclerview);
tv_no_item = findViewById(R.id.tv_no_cards);
activitycartlist = findViewById(R.id.activity_cart_list);
emptycart = findViewById(R.id.empty_cart);
cartcollect = new ArrayList<>();
if (mRecyclerView != null) {
//to enable optimization of recyclerview
mRecyclerView.setHasFixedSize(true);
}
//using staggered grid pattern in recyclerview
mLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
if(session.getCartValue()>0) {
populateRecyclerView();
}else if(session.getCartValue() == 0) {
tv_no_item.setVisibility(View.GONE);
activitycartlist.setVisibility(View.GONE);
emptycart.setVisibility(View.VISIBLE);
}
}
public void populateRecyclerView() {
//Say Hello to our new FirebaseUI android Element, i.e., FirebaseRecyclerAdapter
final FirebaseRecyclerAdapter<SingleProductModel,MovieViewHolder> adapter = new FirebaseRecyclerAdapter<SingleProductModel, MovieViewHolder>(
SingleProductModel.class,
R.layout.cart_item_layout,
MovieViewHolder.class,
//referencing the node where we want the database to store the data from our Object
mDatabaseReference.child("cart").child(mobile).getRef()
) {
@Override
protected void populateViewHolder(final MovieViewHolder viewHolder, final SingleProductModel model, final int position) {
if(tv_no_item.getVisibility()== View.VISIBLE){
tv_no_item.setVisibility(View.GONE);
}
viewHolder.cardname.setText(model.getPrname());
viewHolder.cardprice.setText("NRs."+model.getPrprice());
viewHolder.cardcount.setText("Quantity : "+model.getNo_of_items());
Picasso.with(Cart.this).load(model.getPrimage()).into(viewHolder.cardimage);
totalcost += model.getNo_of_items()*Float.parseFloat(model.getPrprice());
totalproducts += model.getNo_of_items();
cartcollect.add(model);
viewHolder.carddelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(Cart.this,getItem(position).getPrname(),Toast.LENGTH_SHORT).show();
getRef(position).removeValue();
session.decreaseCartValue();
startActivity(new Intent(Cart.this,Cart.class));
finish();
}
});
}
};
mRecyclerView.setAdapter(adapter);
}
public void checkout(View view) {
Intent intent = new Intent(Cart.this,OrderDetails.class);
intent.putExtra("totalprice",Float.toString(totalcost));
intent.putExtra("totalproducts",Integer.toString(totalproducts));
intent.putExtra("cartproducts",cartcollect);
startActivity(intent);
finish();
}
//viewHolder for our Firebase UI
public static class MovieViewHolder extends RecyclerView.ViewHolder{
TextView cardname;
ImageView cardimage;
TextView cardprice;
TextView cardcount;
ImageView carddelete;
View mView;
public MovieViewHolder(View v) {
super(v);
mView = v;
cardname = v.findViewById(R.id.cart_prtitle);
cardimage = v.findViewById(R.id.image_cartlist);
cardprice = v.findViewById(R.id.cart_prprice);
cardcount = v.findViewById(R.id.cart_prcount);
carddelete = v.findViewById(R.id.deletecard);
}
}
private void getValues() {
//create new session object by passing application context
session = new UserSession(getApplicationContext());
//validating session
session.isLoggedIn();
//get User details if logged in
user = session.getUserDetails();
name = user.get(UserSession.KEY_NAME);
email = user.get(UserSession.KEY_EMAIL);
mobile = user.get(UserSession.KEY_MOBiLE);
photo = user.get(UserSession.KEY_PHOTO);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
public void viewProfile(View view) {
startActivity(new Intent(Cart.this,Profile.class));
finish();
}
@Override
protected void onResume() {
super.onResume();
//check Internet Connection
new CheckInternetConnection(this).checkConnection();
}
public void Notifications(View view) {
startActivity(new Intent(Cart.this,NotificationActivity.class));
finish();
}
}
我的logcat显示的是这样的
E/OneSignal: Error updating the user record because of th enull user id
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.beingdev.magicprint, PID: 10699
java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View]
at com.firebase.ui.a.b.onCreateViewHolder(Unknown Source:45)
at android.support.v7.widget.RecyclerView$a.createViewHolder(Unknown Source:6)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:435)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:5)
at android.support.v7.widget.RecyclerView$p.c(Unknown Source:1)
at android.support.v7.widget.as.a(Unknown Source:2)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:86)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:357)
at android.support.v7.widget.StaggeredGridLayoutManager.c(Unknown Source:1)
at android.support.v7.widget.RecyclerView.N(Unknown Source:42)
at android.support.v7.widget.RecyclerView.q(Unknown Source:48)
at android.support.v7.widget.RecyclerView.d(Unknown Source:109)
at android.support.v7.widget.RecyclerView$1.run(Unknown Source:41)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:809)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.NoSuchMethodException: <init> [class android.view.View]
at java.lang.Class.getConstructor0(Class.java:2327)
at java.lang.Class.getConstructor(Class.java:1725)
at com.firebase.ui.a.b.onCreateViewHolder(Unknown Source:25)
at android.support.v7.widget.RecyclerView$a.createViewHolder(Unknown Source:6)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:435)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:5)
at android.support.v7.widget.RecyclerView$p.c(Unknown Source:1)
at android.support.v7.widget.as.a(Unknown Source:2)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:86)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:357)
at android.support.v7.widget.StaggeredGridLayoutManager.c(Unknown Source:1)
at android.support.v7.widget.RecyclerView.N(Unknown Source:42)
at android.support.v7.widget.RecyclerView.q(Unknown Source:48)
at android.support.v7.widget.RecyclerView.d(Unknown Source:109)
at android.support.v7.widget.RecyclerView$1.run(Unknown Source:41)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:809)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
E/UncaughtException: java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View]
at com.firebase.ui.a.b.onCreateViewHolder(Unknown Source:45)
at android.support.v7.widget.RecyclerView$a.createViewHolder(Unknown Source:6)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:435)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:5)
at android.support.v7.widget.RecyclerView$p.c(Unknown Source:1)
at android.support.v7.widget.as.a(Unknown Source:2)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:86)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:357)
at android.support.v7.widget.StaggeredGridLayoutManager.c(Unknown Source:1)
at android.support.v7.widget.RecyclerView.N(Unknown Source:42)
at android.support.v7.widget.RecyclerView.q(Unknown Source:48)
at android.support.v7.widget.RecyclerView.d(Unknown Source:109)
at android.support.v7.widget.RecyclerView$1.run(Unknown Source:41)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:809)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
Caused by: java.lang.NoSuchMethodException: <init> [class android.view.View]
at java.lang.Class.getConstructor0(Class.java:2327)
at java.lang.Class.getConstructor(Class.java:1725)
at com.firebase.ui.a.b.onCreateViewHolder(Unknown Source:25)
at android.support.v7.widget.RecyclerView$a.createViewHolder(Unknown Source:6)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:435)
at android.support.v7.widget.RecyclerView$p.a(Unknown Source:5)
at android.support.v7.widget.RecyclerView$p.c(Unknown Source:1)
at android.support.v7.widget.as.a(Unknown Source:2)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:86)
at android.support.v7.widget.StaggeredGridLayoutManager.a(Unknown Source:357)
at android.support.v7.widget.StaggeredGridLayoutManager.c(Unknown Source:1)
at android.support.v7.widget.RecyclerView.N(Unknown Source:42)
at android.support.v7.widget.RecyclerView.q(Unknown Source:48)
at android.support.v7.widget.RecyclerView.d(Unknown Source:109)
at android.support.v7.widget.RecyclerView$1.run(Unknown Source:41)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks(Choreographer.java:893)
at android.view.Choreographer.doFrame(Choreographer.java:809)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:216)
at android.app.ActivityThread.main(ActivityThread.java:7625)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
D/FA: Logging event (FE): app_exception(_ae), Bundle[{firebase_event_origin(_o)=crash, firebase_screen_class(_sc)=Cart, firebase_screen_id(_si)=-7755245950036280198, timestamp=1589356676240, fatal=1}]
V/FA: Recording user engagement, ms: 532
D/FA: Logging event (FE): user_engagement(_e), Bundle[{firebase_event_origin(_o)=auto, engagement_time_msec(_et)=532, firebase_screen_class(_sc)=Cart, firebase_screen_id(_si)=-7755245950036280198}]
I/Process: Sending signal. PID: 10699 SIG: 9
请帮我解决这个问题。
我通过在Proguard规则中添加细节来解决这个问题。我们需要将包保存在proguardrules.pro文件里面,这样proguard就不会停止运行了。