FirebaseRecyclerAdapter and multiply item types on android

不打扰是莪最后的温柔 提交于 2019-12-03 16:43:05

This answer builds on hatboysam's answer. It took me ages to figure out how everything fits together so I thought I'd describe the solution thoroughly here:

    mRecyclerViewAdapter = new FirebaseRecyclerAdapter<DataObjectModel, ViewHolder>(
            DataObjectModel.class, R.layout.defaultitem_layout, ViewHolder.class, mDatabaseRef) {

        @Override
        public void populateViewHolder(ViewHolder viewholder, final DataObjectModel dataobject, int position) {

            if (getItemViewType(position) == R.layout.my_image_item){
                viewholder.setName(dataobject.getName()); 
            }
            else if (getItemViewType(position) == R.layout.my_no_image_item{
                viewholder.setText(dataobject.getText());
        }


        @Override
        public int getItemViewType(int position) {
            DataObjectModel dataobject = getItem(position);
            if (dataobject.getType() != null && dataobject.getType().equals("image")) {
                // Layout for an item with an image
                return  R.layout.my_image_item);
            } else if (dataobject.getType() != null && dataobject.getType().equals("noimage")) {
                // Layout for an item without an image
                return  R.layout.my_no_image_item;
            }
        }
    };

//getName() and setText() are methods you have to write in the "public static class ChatHolder extends RecyclerView.ViewHolder" class

// Here's the ViewHolder Class for good measure

    public static class ViewHolder extends RecyclerView.ViewHolder {
        View mView;

        public ViewHolder (View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setName(String name) {
            TextView field = (TextView) mView.findViewById(R.id.name_text);
            field.setText(name);
        }

        public void setText(String text) {
            TextView field = (TextView) mView.findViewById(R.id.message_text);
            field.setText(text);
        }
}

You need to override the getItemViewType method to return the resource ID for the layout you want to load. Like this:

@Override
public int getItemViewType(int position) {
    if (hasImage(position)) {
        // Layout for an item with an image
        return R.layout.my_image_item;
    } else {
        // Layout for an item without an image
        return R.layout.my_no_image_item;
    }
}

This will cause onCreateViewHolder to inflate the correct layout for each item. Your ViewHolder class will need to be able to handle both item types. Then in populateViewHolder you can populate the appropriate views based on the item position.

robert jeong

Try to make it Override.

mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

I found answer on this web-site.

 mAdapter = new FirebaseRecyclerAdapter<User, RecyclerView.ViewHolder>(
            User.class, R.layout.item_user, RecyclerView.ViewHolder.class, ref) {
        @Override
        protected void populateViewHolder(final RecyclerView.ViewHolder viewHolder, final User user,
                                          final int position) {
            switch (user.getType()) {
                case Constants.USER_TYPE_1:
                    populateType1((ViewHolder1) viewHolder, user, position);
                    break;
                case Constants.USER_TYPE_2:
                    populateType2((ViewHolder2) viewHolder, user, position);
                    break;
                case Constants.USER_TYPE_3:
                    populateType3((ViewHolder3) viewHolder, user, position);
                    break;
            }
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            switch (viewType) {
                case USER_TYPE_1:
                    View userType1 = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.item_type1, parent, false);
                    return new ViewHolder1(userType1);
                case USER_TYPE_2:
                    View userType2 = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.item_type2, parent, false);
                    return new ViewHolder2(userType2);
                case USER_TYPE_3:
                    View userType3 = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.item_type3, parent, false);
                    return new ViewHolder3(userType3);
            }
            return super.onCreateViewHolder(parent, viewType);
        }

        @Override
        public int getItemViewType(int position) {
            User user = getItem(position);
            switch (user.getType()) {
                case Constants.USER_TYPE_1:
                    return USER_TYPE_1;
                case Constants.USER_TYPE_2:
                    return USER_TYPE_2;
                case Constants.USER_TYPE_3:
                    return USER_TYPE_3;
            }
            return super.getItemViewType(position);
        }
    };
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!