【问题标题】:Database exception in recycler adapter回收器适配器中的数据库异常
【发布时间】: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


【解决方案1】:

只需将ArrayList value; 声明为ArrayList&lt;String&gt; value;

然后初始化value = new ArrayList&lt;&gt;();

终于用上了

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());
        }
    }
});

【讨论】:

  • 不,这绝对不是他的解决方案,我已经从 ChatClass 中删除了 value 参数,据我所知,错误是因为没有正确引用数据库。我没有在数据库中使用对 Messages 对象的子引用,这就是它引用整个数据库的原因。
  • 现在我面临一个新问题,即它只获取最后更新的值或发送的最后一条消息,而不是程序必须显示的消息列表
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多