【发布时间】:2018-03-14 15:32:06
【问题描述】:
我正在为我的应用程序中的聊天功能创建一个recycler 适配器。我正在访问来自Firebase 的存储消息。但是,在显示一条消息后,我的应用程序崩溃并出现数据库异常。
Error:
com.google.firebase.database.DatabaseException: Can't convert object of type
java.util.ArrayList to type com.example.delluser.oshoguide.ChatClass
我对这个异常感到沮丧。我不知道它在谈论哪个数组列表,因为文本是从模型对象获得的,而不是数组列表。请帮忙。
如果我重写 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 数据库:
这是我的 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;
}
}
【问题讨论】:
-
尝试发布您的 logcat,以便人们可以看到错误发生的位置。仅仅给出错误的文本是不够的。
-
另外,不要使用
System.out.println("error message");使用e.PrintStackTrace();。您隐藏了错误并使其无法调试 -
您没有使用推送 ID,这会导致在 Firebase 上以数组列表的形式(即所有字段)存储数据,使用推送键存储对象并通过事件侦听器检索它们并将它们转换为相同的数据类型您已将它们推送到 Firbase。
-
你能分享你的模型类(ChatClass)吗?
-
@EnamulHaque 我已经分享了模型类
标签: android firebase arraylist firebase-realtime-database android-recyclerview