Recyclerview返回Null ......具有与SO中的任何错误不同的问题

时间:2018-04-24 10:40:56

标签: android firebase firebase-realtime-database android-recyclerview

我有一个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之前很好,所以它不是因为逻辑或数据库

2 个答案:

答案 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_usernull

替换为

if (from_user!=null && from_user.equals(current_user_id)){
     holder.messageText.setBackgroundResource(Color.BLUE);
     holder.messageText.setTextColor(Color.RED);
}

答案 1 :(得分:0)

Firebase调用都是异步的,并且无法检查调用是否已执行且您是否已收到数据,因此这可能是因为数据尚未到达且您尝试绑定数据的原因对于视图,请尝试使用处理程序进行这些Firebase调用