我正在为我的应用程序中的聊天功能创建一个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数据库:
这是我的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;
}
}
答案 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());
}
}
});