FirebaseRecyclerAdapter doesn't recognize first layout as a position

后端 未结 2 2061
余生分开走
余生分开走 2020-12-06 20:52

My Title is kind of hard to understand but basically when I add items into my database is should display it in a RecyclerView. Now in my RecyclerView I have two

2条回答
  •  清歌不尽
    2020-12-06 20:59

    Why use the Firebase Recycler Adapter when you could easily make a custom one? If I understood well you want an item to be fixed at position 0 (header) while others will be added below the first one, right? If so, here is a solution I like to use:

    public interface ViewType {
        public int getViewType();
    }
    
    public interface ViewTypeDelegateAdapter {
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent);
        public void onBindViewHolder(RecyclerView.ViewHolder holder, ViewType item);
    }
    
    public class ViewTypes {
        public static int HEADER = 0
        public static int ITEM = 1
    }
    
    public class ProductDelegateAdapter implements ViewTypeDelegateAdapter {
    
        private int resID;
        private Context context;
    
        public ProductDelegateAdapter(int resID, Context context) {
            this.resID = resID;
            this.context = context;
        }
    
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
            return new ProductHolder(LayoutInflater.from(parent.context).inflate(resID, parent, false));
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, ViewType item) {
            (holder as ProductHolder).bind("test");
        }
    
        class ProductHolder extends RecyclerView.ViewHolder {
    
            public ProductHolder(View view) {
                super(view);
            }
    
            public void bind(String test) {
    
            }
    
        }
    
    }
    
    public class HeaderDelegateAdapter implements ViewTypeDelegateAdapter {
    
        private int resID;
        private Context context;
    
        public ProductDelegateAdapter(int resID, Context context) {
            this.resID = resID;
            this.context = context;
        }
    
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) {
            return new HeaderHolder(LayoutInflater.from(parent.context).inflate(resID, parent, false));
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, ViewType item) {
            (holder as HeaderHolder).bind("test");
        }
    
        class HeaderHolder extends RecyclerView.ViewHolder {
    
            public HeaderHolder(View view) {
                super(view);
            }
    
            public void bind(String test) {
    
            }
    
        }
    
    }
    
    public class AccAdapter extends RecyclerView.Adapter() {
    
        private Context context;
        private List items;
        private SparseArrayCompat delegateAdapters;
        private ViewType headerItem;
    
        public AccAdapter(Context context) {
            this.context = context;
            this.items = new ArrayList();
            this.delegateAdapters = new SparseArrayCompat();
            this.headerItem = new ViewType() {
                @Override
                public int getViewType() {
                    return ViewTypes.HEADER;
                }
            };
    
            this.items.add(this.headerItem);
            this.delegateAdapters.put(ViewTypes.HEADER, HeaderDelegateAdapter(R.id.test, this.context));
            this.delegateAdapters.put(ViewTypes.ITEM, ProductDelegateAdapter(R.id.test, this.context));
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, Int viewType) {
            return delegateAdapters.get(viewType).onCreateViewHolder(parent);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, Int position) {
            delegateAdapters.get(getItemViewType(position)).onBindViewHolder(holder, items[position])
        }
    
        @Override
        public Int getItemViewType(Int position) {
            return items.get(position).getViewType();
        }
    
        @Override
        public Int getItemCount() {
            return items.getSize();
        }
    
        public void add(ViewType viewType) {
            val initPosition = this.items.size - 1
            this.items.add(item)
            notifyItemRangeChanged(initPosition, this.items.size + 1)
        }
    
    }
    
    public class Event implements ViewType {
    
        private String id;
    
        @Override
        public int getViewType() {
            return ViewTypes.ITEM;
        }
    
    }
    

    Excuse me for some syntax errors, I've translated to Java from Kotlin to help you. Hope it helps!

提交回复
热议问题