我有一个listview用于显示消息列表,我将其更改为recyclerview以获得更好的可读性和UI并返回nullpointerexception ...可以帮助我解决为什么它的重新生成null
活动
RecyclerView messageList;
List<Messages> messagesList = new ArrayList<>();
private LinearLayoutManager linearLayoutManager;
private MessageAdapter mAdapter;
mAdapter = new MessageAdapter(messagesList);
messageList = (RecyclerView) findViewById(R.id.messageList);
linearLayoutManager = new LinearLayoutManager(this);
messageList.setHasFixedSize(true);
messageList.setLayoutManager(linearLayoutManager);
messageList.setAdapter(mAdapter);
private void fetchMessages() {
rootRef.child("Messages").child(MessageSenderId).child(MessageRecieverId).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Messages message = dataSnapshot.getValue(Messages.class);
messagesList.add(message);
mAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
消息类
public class Messages {
private String from;
private String message;
private String type;
private boolean seen;
private long time;
public Messages(){};
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isSeen() {
return seen;
}
public void setSeen(boolean seen) {
this.seen = seen;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
}
适配器
public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder>{
private List<Messages> userMessageList;
private FirebaseAuth mAuth;
public MessageAdapter (List<Messages>userMessageList)
{
this.userMessageList = userMessageList;
}
public class MessageViewHolder extends RecyclerView.ViewHolder{
public TextView messageText;
public MessageViewHolder(View view)
{
super(view);
messageText = (TextView)view.findViewById(R.id.message_text);
}
}
@Override
public int getItemCount()
{
return userMessageList.size();
}
@Override
public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View V = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_chat_custom,parent,false);
mAuth = FirebaseAuth.getInstance();
return new MessageViewHolder(V);
}
@SuppressLint("ResourceType")
@Override
public void onBindViewHolder(MessageViewHolder holder, int position) {
String current_user_id = mAuth.getInstance().getCurrentUser().getUid();
Messages messages = userMessageList.get(position);
String from_user = messages.getFrom();
// Log.d("TAG",current_user_id + "/" + from_user);
if (from_user.equals(current_user_id)){
holder.messageText.setBackgroundResource(Color.BLUE);
holder.messageText.setTextColor(Color.RED);
}else {
holder.messageText.setBackgroundResource(R.drawable.text_background1);
holder.messageText.setTextColor(Color.CYAN);
}
holder.messageText.setText(messages.getMessage());
}
}
我在行中遇到错误if(from_user.equals(current_user_id)){
错误
FATAL EXCEPTION: main
Process: com.appmaster.akash.messageplus, PID: 1135
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.appmaster.akash.messageplus.MessageAdapter.onBindViewHolder(MessageAdapter.java:59)
at com.appmaster.akash.messageplus.MessageAdapter.onBindViewHolder(MessageAdapter.java:19)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
at android.view.View.layout(View.java:16669)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2207)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1963)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6064)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
at android.view.Choreographer.doCallbacks(Choreographer.java:672)
at android.view.Choreographer.doFrame(Choreographer.java:608)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
at android.os.Handler.handleCallback(Handler.java:742)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5
有人请帮帮我....抱歉,如果它的代码太多,但是要找出错误是什么,需要这么多代码...如果你需要更多细节请问......而且它也很完美在我使用listview之前很好,所以它不是因为逻辑或数据库
答案 0 :(得分:1)
String from_user = messages.getFrom();
if (from_user.equals(current_user_id)){
holder.messageText.setBackgroundResource(Color.BLUE);
holder.messageText.setTextColor(Color.RED);
}
from_user
是null
替换为
if (from_user!=null && from_user.equals(current_user_id)){
holder.messageText.setBackgroundResource(Color.BLUE);
holder.messageText.setTextColor(Color.RED);
}
答案 1 :(得分:0)
Firebase调用都是异步的,并且无法检查调用是否已执行且您是否已收到数据,因此这可能是因为数据尚未到达且您尝试绑定数据的原因对于视图,请尝试使用处理程序进行这些Firebase调用