Dan Tsk
Dan Tsk

Reputation: 71

FirebaseRecyclerAdapter and multiply item types on android

I want to add 2 types:-

  1. with image
  2. without image

in my recyclerview. I know that I need to override method from FirebaseRecyclerAdapter but I don't know how. Help me please with this.

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


abstract protected void populateViewHolder(VH viewHolder, T model, int position);

So I want to get from T-model type of item via int (1 - with image, 2 - without) and change mModelLayout basing on this info. Can I just add if else statement there ?

Upvotes: 4

Views: 1831

Answers (4)

robert jeong
robert jeong

Reputation: 1

Try to make it Override.

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

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

Upvotes: 0

CacheMeOutside
CacheMeOutside

Reputation: 737

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);
        }
}

Upvotes: 3

Sam Stern
Sam Stern

Reputation: 25134

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.

Upvotes: 1

Dan Tsk
Dan Tsk

Reputation: 71

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);
        }
    };

Upvotes: -1

Related Questions