Android 如果使用发布密钥库生成,FirebaseRecyclerAdapter将不提供任何方法异常

Android 如果使用发布密钥库生成,FirebaseRecyclerAdapter将不提供任何方法异常,android,firebaseui,Android,Firebaseui,我从中了解到,要修复NoSuchMethodException: 确保TaskViewHolder类是公共的 如果TaskViewHolder是一个内部类,例如活动,请确保它是静态的 只有在使用调试密钥库构建应用程序时,解决方案才有效。但是在我使用release密钥库构建应用程序之后,我仍然没有得到任何方法异常。 minifyEnabled=false 在Android One棉花糖水户A10、荣誉6和marsmallow模拟器上测试 堆栈跟踪错误: Exception java.lang.Ru

我从中了解到,要修复NoSuchMethodException:

  • 确保TaskViewHolder类是公共的
  • 如果TaskViewHolder是一个内部类,例如活动,请确保它是静态的
  • 只有在使用调试密钥库构建应用程序时,解决方案才有效。但是在我使用release密钥库构建应用程序之后,我仍然没有得到任何方法异常。 minifyEnabled=false

    在Android One棉花糖水户A10、荣誉6和marsmallow模拟器上测试

    堆栈跟踪错误:

    Exception java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View]
    com.firebase.ui.database.FirebaseRecyclerAdapter.onCreateViewHolder (FirebaseRecyclerAdapter.java:172)
    android.support.v7.widget.RecyclerView$Adapter.createViewHolder (RecyclerView.java:5836)
    android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5060)
    android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:4970)
    android.support.v7.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2029)
    android.support.v7.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1414)
    android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1377)
    android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:578)
    android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3315)
    android.support.v7.widget.RecyclerView.onMeasure (RecyclerView.java:2843)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical (LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure (LinearLayout.java:630)
    android.view.View.measure (View.java:18788)
    android.widget.ScrollView.measureChildWithMargins (ScrollView.java:1283)
    android.widget.FrameLayout.onMeasure (FrameLayout.java:194)
    android.widget.ScrollView.onMeasure (ScrollView.java:340)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical (LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure (LinearLayout.java:630)
    android.view.View.measure (View.java:18788)
    android.widget.RelativeLayout.measureChildHorizontal (RelativeLayout.java:715)
    android.widget.RelativeLayout.onMeasure (RelativeLayout.java:461)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.FrameLayout.onMeasure (FrameLayout.java:194)
    android.support.v7.widget.ContentFrameLayout.onMeasure (ContentFrameLayout.java:135)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical (LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure (LinearLayout.java:630)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.FrameLayout.onMeasure (FrameLayout.java:194)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical (LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure (LinearLayout.java:630)
    android.view.View.measure (View.java:18788)
    android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5951)
    android.widget.FrameLayout.onMeasure (FrameLayout.java:194)
    com.android.internal.policy.PhoneWindow$DecorView.onMeasure (PhoneWindow.java:2643)
    android.view.View.measure (View.java:18788)
    android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:2100)
    android.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:1216)
    android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1452)
    android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1107)
    android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:6013)
    android.view.Choreographer$CallbackRecord.run (Choreographer.java:858)
    android.view.Choreographer.doCallbacks (Choreographer.java:670)
    android.view.Choreographer.doFrame (Choreographer.java:606)
    android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:844)
    android.os.Handler.handleCallback (Handler.java:739)
    android.os.Handler.dispatchMessage (Handler.java:95) 
    
    Exception java.lang.RuntimeException:java.lang.NoSuchMethodException:[类android.view.view]
    com.firebase.ui.database.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:172)
    android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5836)
    android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5060)
    android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4970)
    LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
    android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
    android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
    android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:578)
    android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3315)
    android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2843)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    android.view.view.measure(view.java:18788)
    android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1283)
    android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    android.widget.ScrollView.onMeasure(ScrollView.java:340)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    android.view.view.measure(view.java:18788)
    android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
    android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    android.view.view.measure(view.java:18788)
    android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
    android.view.view.measure(view.java:18788)
    android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
    android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)
    android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)
    android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
    android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
    Choreographer$CallbackRecord.run(Choreographer.java:858)
    android.view.Choreographer.doCallbacks(Choreographer.java:670)
    android.view.Choreographer.doFrame(Choreographer.java:606)
    Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
    android.os.Handler.handleCallback(Handler.java:739)
    android.os.Handler.dispatchMessage(Handler.java:95)
    
    我的ViewHolder位于单独的CommentHolder.java文件中,带有public:

    public class CommentHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {
    TextView tvComment = null;
    TextView tvUser = null;
    TextView tvDate = null;
    String emailComment = "";
    String commentKey, catalogKey;
    
    FirebaseAuth auth;
    FirebaseDatabase database;
    CommentHolder(View row) {
        super(row);
        auth=FirebaseAuth.getInstance();
        database=FirebaseDatabase.getInstance();
    
        tvComment = (TextView) row.findViewById(R.id.comment);
        tvUser = (TextView) row.findViewById(R.id.user);
        tvDate = (TextView) row.findViewById(R.id.datecomment);
    
        row.setOnClickListener(this);
    }
    
    @Override
    public void onClick(final View v) {
    
        if (auth.getCurrentUser() == null || auth.getCurrentUser().getEmail() == null) {
    
            Toast.makeText(v.getContext(), "Harap login terlebih dahulu", Toast.LENGTH_LONG).show();
            return;
        }
        if (!auth.getCurrentUser().getEmail().equalsIgnoreCase(emailComment)) {
            Toast.makeText(v.getContext(), "Anda hanya dapat mengedit komentar yang Anda buat", Toast.LENGTH_LONG).show();
            return;
        }
    
    
        final View form = ((Activity) v.getContext()).getLayoutInflater().inflate(R.layout.dialog_comment, null);
        EditText etComment = (EditText) form.findViewById(R.id.editTextComment);
        etComment.setText(tvComment.getText().toString());
    
        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
    
        builder
                .setTitle("Komentar Anda")
                .setView(form)
                .setPositiveButton("Kirim", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        final EditText etComment = (EditText) form.findViewById(R.id.editTextComment);
                        DatabaseReference commentRef = database.getReference(MyConstants.FB_COMMENT)
                                .child(catalogKey).child(commentKey);
                        Comment comment = new Comment(auth.getCurrentUser().getUid()
                                , auth.getCurrentUser().getEmail(), etComment.getText().toString());
                        commentRef.setValue(comment);
    
                    }
                })
                .setNegativeButton("Batal", null)
                .setNeutralButton("Hapus", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        DatabaseReference commentRef = database.getReference(MyConstants.FB_COMMENT)
                                .child(catalogKey).child(commentKey);
                        commentRef.removeValue();
                    }
                })
                .show();
    
    
    }
    
    void bindModel(String catalogKey, String commentKey, String comment, String emailComment, String dateComment) {
        tvComment.setText(comment);
        String temp = emailComment.replaceAll("(?<=.).(?=[^@]*?.@)", "*");
        tvUser.setText(temp);
        tvDate.setText(dateComment);
        this.emailComment = emailComment;
        this.commentKey = commentKey;
        this.catalogKey = catalogKey;
    }
    
    public类CommentHolder扩展了RecyclerView.ViewHolder
    实现View.OnClickListener{
    TextView tvComment=null;
    TextView tvUser=null;
    TextView tvDate=null;
    字符串emailComment=“”;
    字符串注释键、目录键;
    FirebaseAuth-auth;
    Firebase数据库;
    CommentHolder(视图行){
    超级(世界其他地区);
    auth=FirebaseAuth.getInstance();
    database=FirebaseDatabase.getInstance();
    TVComent=(TextView)row.findViewById(R.id.comment);
    tvUser=(TextView)row.findViewById(R.id.user);
    tvDate=(TextView)row.findviewbyd(R.id.datecomment);
    row.setOnClickListener(this);
    }
    @凌驾
    公共void onClick(最终视图v){
    如果(auth.getCurrentUser()==null | | auth.getCurrentUser().getEmail()==null){
    Toast.makeText(v.getContext(),“Harap login terlebih dahulu”,Toast.LENGTH_LONG.show();
    返回;
    }
    如果(!auth.getCurrentUser().getEmail().equalsIgnoreCase(emailComment)){
    Toast.makeText(v.getContext(),“Anda hanya dapat mengedit komentar yang and a buat”,Toast.LENGTH_LONG.show();
    返回;
    }
    最终视图形式=((活动)v.getContext()).getLayoutFlater().inflate(R.layout.dialog_com
    
    mAdapter = new FirebaseRecyclerAdapter<Comment, CommentHolder>(Comment.class, R.layout.play_row
                , CommentHolder.class, commentRef) {
            @Override
            public void populateViewHolder(CommentHolder commentHolder, Comment comment, int position) {
    
                Date date = new Date((long) comment.getLastUpdate().get("date"));
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
                String strDate = simpleDateFormat.format(date);
                commentHolder.bindModel(catalogKey, getRef(position).getKey(), comment.getComment(), comment.getEmail(), strDate);
    
            }
    
        };
    
    public class Comment {
    String uid;
    String email;
    String comment;
    HashMap<String, Object> lastUpdate;
    
    public Comment() {
    }
    
    public Comment(String uid, String email, String comment) {
        this.uid=uid;
        this.email = email;
        this.comment = comment;
        HashMap<String, Object> lastUpdateObj = new HashMap<>();
        lastUpdateObj.put("date", ServerValue.TIMESTAMP);
        this.lastUpdate = lastUpdateObj;
    
    
    }
    
    public String getUid() {
        return uid;
    }
    
    public String getEmail() {
        return email;
    }
    
    public String getComment() {
        return comment;
    }
    
    public HashMap<String, Object> getLastUpdate() {
        return lastUpdate;
    }
    }
    
    public CommentHolder(View row) {
    super(row);
    auth=FirebaseAuth.getInstance();
    database=FirebaseDatabase.getInstance();
    
    tvComment = (TextView) row.findViewById(R.id.comment);
    tvUser = (TextView) row.findViewById(R.id.user);
    tvDate = (TextView) row.findViewById(R.id.datecomment);
    
    row.setOnClickListener(this);
    }