回收器适配器中的数据库异常

时间:2017-10-03 12:23:12

标签: android firebase arraylist firebase-realtime-database recycler-adapter

我正在为我的应用程序中的聊天功能创建一个recycler适配器。我正在访问Firebase中存储的消息。但是,在显示一条消息后,我的应用程序崩溃,导致数据库异常。

Error:
com.google.firebase.database.DatabaseException: Can't convert object of type 
java.util.ArrayList to type com.example.delluser.oshoguide.ChatClass

我对这个例外感到沮丧。我不知道它正在谈论哪个arraylist,因为文本是从模型对象而不是arraylist获得的。请帮助。

如果我覆盖getItemcount方法,它甚至会在没有显示一个输出的情况下崩溃。

此外,崩溃正在发生,因为它在任务完成后重新进入OnCreateViewHolder,即不止一次。后来,应用程序崩溃。

这是我的代码:

public class ChatActivity extends AppCompatActivity {

FirebaseRecyclerAdapter<ChatClass,ViewHolder> adapter;
RelativeLayout activity_chat;
FloatingActionButton fab;
Firebase ref,mref;
TextView tv_name,tv_message;
ArrayList value;
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
RecyclerView lv_chat;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    System.out.println("enter chat activity ");
    activity_chat = (RelativeLayout)findViewById(R.id.chat_activity);

    lv_chat = (RecyclerView)findViewById(R.id.lv_chat);
    lv_chat.setHasFixedSize(true);
    lv_chat.setLayoutManager(new LinearLayoutManager(this));

    value = new ArrayList();
    if(user!=null)
    {

        System.out.println("user is not null");
    fab = (FloatingActionButton)findViewById(R.id.fab);

        ref = new Firebase("https://oshoguide.firebaseio.com/useraccount/users");
        mref = new Firebase("https://oshoguide.firebaseio.com/Messages");

        System.out.println("running add value listener in chat activity ");
        ref.addValueEventListener(new com.firebase.client.ValueEventListener() {
            @Override
            public void onDataChange(com.firebase.client.DataSnapshot dataSnapshot) {
                for(com.firebase.client.DataSnapshot ds : dataSnapshot.getChildren())
                {

                    System.out.println("value "+ds.getValue());
                    try {
                        JSONObject j = new JSONObject(ds.getValue().toString());
                        value.add(j.getString("number"));
                        value.add(j.getString("name")) ;
                        value.add(j.getString("email")) ;
                        System.out.println(value.get(0).toString()+" "+value.get(1).toString()+" "+value.get(2).toString());
                    } catch (Exception e) {
                        System.out.println("exception in event listener"+e.getMessage());
                    }


                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {


            }
        });
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            try {
                EditText input = (EditText) findViewById(R.id.input);
                FirebaseDatabase.getInstance().getReference().child("Messages").setValue(new ChatClass(input.getText().toString(), value.get(1).toString()));
                displaychatmessage();
                input.setText("");
            }
            catch (Exception e)
            {
                System.out.println("exception in onclicklistener"+e.getMessage());
            }
        }
    });

    Snackbar.make(activity_chat,"Welcome to Chat Station",Snackbar.LENGTH_LONG).show();

}

else
    {
        startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(),1);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode ==1)
    {
        if( requestCode ==RESULT_OK)
        {
            Toast.makeText(this,"Success", Toast.LENGTH_SHORT).show();
            }
            else
        {
            Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show();
        }
    }
}

public void displaychatmessage() {

    try
    {
    System.out.println("enter dispplay mesage");

    adapter = new FirebaseRecyclerAdapter<ChatClass, ViewHolder>(ChatClass.class,R.layout.list_item,ViewHolder.class,FirebaseDatabase.getInstance().getReference()) {
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            System.out.println("entered on create view ");
              View v = getLayoutInflater().inflate(R.layout.list_item,null);
            ViewHolder vh = new ViewHolder(v);
            return vh;
        }

        @Override
        protected void populateViewHolder(ViewHolder viewHolder, ChatClass model, int position) {
          try {
              System.out.println("enter populate view ");

              viewHolder.message_text.setText(model.getText());
              viewHolder.message_user.setText(model.getUser());
              System.out.println("printed message ");
          }
          catch (Exception e)
          {
              System.out.println("exception in populate view "+e.getMessage());
          }
        }
    };


    lv_chat.setAdapter(adapter);
}
catch (Exception e)
{
    System.out.println("excepiton in display message "+ e.getMessage());
}
}

public class ViewHolder extends RecyclerView.ViewHolder
{
            TextView message_user,message_time,message_text;

    public ViewHolder(View v) {
        super(v);
        try {
            System.out.println("enter constructor of view holder ");
            message_user = (TextView) v.findViewById(R.id.message_user);
            message_text = (TextView) v.findViewById(R.id.message_text);
            System.out.println("exit constructor");
        }
        catch (Exception e)
        {
            System.out.println("exception on view holder ");
        }
    }
}

这是我的firebase数据库:

enter image description here

这是我的ChatClass:

public class ChatClass {

  String text;
  String user;
  long time;

  public ChatClass(String text, String user) {
    this.text = text;
    this.user = user;

    time = new Date().getTime();
  }

  public ChatClass() {
  }

  public String getText() {
    return text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public String getUser() {
    return user;
  }

  public void setUser(String user) {
    this.user = user;
  }

  public long getTime() {
    return time;
  }

  public void setTime(long time) {
    this.time = time;
  }
}

1 个答案:

答案 0 :(得分:0)

只需将ArrayList value;声明为ArrayList<String> value;

即可

然后初始化value = new ArrayList<>();

最后使用它

fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        try {
            EditText input = (EditText) findViewById(R.id.input);

            //use it hare though no change needed at all
            //use at it is 
            FirebaseDatabase.getInstance().getReference().child("Messages")
                            .setValue(new ChatClass(input.getText().toString(), 
                             value.get(1).toString()));
            displaychatmessage();
            input.setText("");
        }
        catch (Exception e)
        {
            System.out.println("exception in onclicklistener"+e.getMessage());
        }
    }
});