如何在 FirebaseRecyclerAdapter 中设置多个布局?

How to set multiple layout in FirebaseRecyclerAdapter?

我只是用 Firebase 制作了一个聊天应用程序,在 XML 中使用了 RecyclerView,在 Android 中使用了 FirebaseRecyclerAdapter,但问题是当我通过 EditText 发送消息时,消息发送成功并在右侧显示我使用 Layout 设置的内容,如下面的代码所示,但问题是当我关闭应用程序并重新启动消息时,消息会转到左侧:

            mFirebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MessageModel, MessageViewHolder>(
                MessageModel.class,
                R.layout.layout_message_sender,
                MessageViewHolder.class,
                mFirebaserefrence_messages) {


            @Override
            public int getItemViewType(int position) {
                MessageModel model = getItem(position);
                if (model.getUserId() == mUserId) {
                    return R.layout.layout_message_sender;
                }
                else {
                    return R.layout.layout_message_recipitent;
                }
            }

            @Override
            protected void populateViewHolder(MessageViewHolder viewHolder, MessageModel model, int position) {
                viewHolder.mTextView_userMessage.setText(model.getUserMessage());
                if (model.getUserName() == null) {
                    viewHolder.mTextView_userName.setText("Anonymous");
                } else {
                    viewHolder.mTextView_userName.setText(model.getUserName());
                }
                if (model.getUserImageUrl() == null) {
                    viewHolder.mCircleImageView_userImage
                            .setImageDrawable(ContextCompat.getDrawable(ChatActivity.this,
                                    R.drawable.ic_account_circle_red_48dp));
                } else {
                    Glide.with(ChatActivity.this)
                            .load(model.getUserImageUrl())
                            .into(viewHolder.mCircleImageView_userImage);
                }
            }

        };

        mFirebaseRecyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
            @Override
            public void onItemRangeInserted(int positionStart, int itemCount) {
                super.onItemRangeInserted(positionStart, itemCount);
                int messageCount = mFirebaseRecyclerAdapter.getItemCount();
                int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
                // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll
                // to the bottom of the list to show the newly added message.
                if (lastVisiblePosition == -1 ||
                        (positionStart >= (messageCount - 1) && lastVisiblePosition == (positionStart - 1))) {
                    mRecyclerView.scrollToPosition(positionStart);
                }
            }
        });

        mRecyclerView.setLayoutManager(mLinearLayoutManager);
        mRecyclerView.setAdapter(mFirebaseRecyclerAdapter);

        mEditText_message = (EditText) findViewById(R.id.editText_message);
        mEditText_message.addTextChangedListener(new TextWatcher() {
                                                     @Override
                                                     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                                                     }

                                                     @Override
                                                     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                                                         if (charSequence.toString().trim().length() > 0) {
                                                             mImageButton.setEnabled(true);
                                                         } else {
                                                             mImageButton.setEnabled(false);
                                                         }
                                                     }

                                                     @Override
                                                     public void afterTextChanged(Editable editable) {
                                                     }
                                                 }
        );

        mImageButton = (ImageButton) findViewById(R.id.imageButton_send);

        mImageButton.setOnClickListener(this);
    }

    @Override
    public void onStart() {
        super.onStart();
        mFirebaseAuth.addAuthStateListener(mFirebaseAuthListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mFirebaseAuthListener != null) {
            mFirebaseAuth.removeAuthStateListener(mFirebaseAuthListener);
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item_signOut:
                mFirebaseAuth.signOut();
                startActivity(new Intent(ChatActivity.this, SignInActivity.class));
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onClick(View v) {
        if (v == mImageButton) {
            MessageModel messageModel = new MessageModel(mUserId,
                    mUserImageUrl,
                    mEditText_message.getText().toString(),
                    mUsername,
                    null);
            mFirebaserefrence_messages.push().setValue(messageModel);
            mEditText_message.setText(null);
        }
    }
}

FirebaseUI 适配器专为具有单一布局的同类列表而设计。虽然拥有多个布局的异构列表一直被认为是一个有趣的添加功能(参见 this original feature request),但到目前为止还没有添加。

有一个开放的功能请求,专门为 FirebaseUI 库添加 multi-layout 支持:https://github.com/firebase/FirebaseUI-Android/issues/305

您可能想对此投上您的一票/+1。

public Class MyAdapter extends FirebaseRecyclerAdapter<ModelClass, ViewHolderClass> {

    private static final int LAYOUT_ONE = 1;

    public MyAdapter(Class<ModelClass> modelClass,
                       int modelLayout,
                       Class<ViewHolderClass> viewHolderClass,
                       Query ref) {

        super(modelClass, modelLayout, viewHolderClass, ref);

    }
    
    @Override
    public ViewHolderClass onCreateViewHolder(ViewGroup parent, int viewType) {
    
        View view;
        
        if (viewType == LAYOUT_ONE) {

            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_one, parent, false);
            return new ViewHoldeClassr(view);

        } 
        
        else {

            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_two, parent, false);
            return new ViewHolderClass(view);

        }
    }
    
    @Override
    public int getItemViewType(int position) 
    
        ModelClass model = getItem(position);
        
        if (model.caseWhenYouWentToUseLayoutOne)) {
            return LAYOUT_ONE;
        }
        
        return position;
    }

}