ishwor kafley
ishwor kafley

Reputation: 938

how to make the header of Recycle view invisible

I have a Recyclerview with header view as slider images and remaining view as normal recycler items.I am wondering if there is any way around to make the header view invisible depending upon some sort of condition.The recycler view consists of two separate layout files for this purpose: layout1 for header items and layout2 for normal recycler items and adapter will pick a layout and binds corresponding data at runtime.

This is my RecyclerView adapter RestaurantAdapter.java

    public class RestaurantAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        private static final String TAG = RestaurantAdapter.class.getName();
        private List<Restaurant> mList;
        private Context mContext;
        private RestaurantType mRestaurantType;
        private static final int RECYCLER_HEADER=0,RECYCLER_ITEMS=1;
        private LayoutInflater inflater;
        private SlideItemViewHolder slideItemViewHolder;
        private List<ImageSliderPOJO> mData;

        public RestaurantAdapter(Context context, List<Restaurant> list, RestaurantType restaurantType) {
            this.mContext = context;
            this.mList = list;
            this.mRestaurantType = restaurantType;
            inflater=LayoutInflater.from(context);

        }

        public void updateAdapter(List<ImageSliderPOJO> data){
            this.mData = data;
            this.notifyDataSetChanged();
        }


        @Override
        public int getItemCount() {
            return mList.size();
        }

        @Override
        public int getItemViewType(int position) {
            return position == 0 ? RECYCLER_HEADER : RECYCLER_ITEMS;
        }

        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int i) {
            int viewType=viewHolder.getItemViewType();
            switch (viewType){
                case RECYCLER_HEADER:
                    slideItemViewHolder = (SlideItemViewHolder) viewHolder;
                    slideItemViewHolder.updateHeader();
                    break;

                case RECYCLER_ITEMS:
                    final RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder;
                    final Restaurant restaurant = mList.get(i);
                    Picasso.with(mContext)
                            .load(restaurant.getVendorLogo())
                            .placeholder(R.mipmap.ic_launcher)
                            .error(R.mipmap.ic_launcher)
                            .into(holder.restaurentImageView);

                    holder.restaurentNameTextView.setText(restaurant.getName());
                 //Remaining code here

                    break;

                default:
                    throw new RuntimeException(TAG+":Unable to bind the viewType"+viewType);

            }
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

            switch (viewType){
                case RECYCLER_HEADER:
                    return new SlideItemViewHolder(inflater.inflate(R.layout.slide_show_restaurant_fragment_list,viewGroup,false));

                case RECYCLER_ITEMS:
                    return new RecyclerItemViewHolder(inflater.inflate(R.layout.new_restautant_list_items, viewGroup, false));

                default:
                  throw new RuntimeException(TAG+":Invalid ViewType "+viewType);
            }

        }

        public static class RecyclerItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            private ClickListener clickListener;
             //Initialization here.


            public RecyclerItemViewHolder(View v) {
                super(v);
                ButterKnife.inject(this, v);
                v.setOnClickListener(this);


            }

            @Override
            public void onClick(View v) {
                clickListener.onClick(v, getPosition(), false);
            }

            public interface ClickListener {

                /**
                 * Called when the view is clicked.
                 *
                 * @param v           view that is clicked
                 * @param position    of the clicked item
                 * @param isLongClick true if long click, false otherwise
                 */
                public void onClick(View v, int position, boolean isLongClick);

            }

            /* Setter for listener. */
            public void setClickListener(ClickListener clickListener) {
                this.clickListener = clickListener;
            }
        }


        // id = 87,170

        private class SlideItemViewHolder extends RecyclerView.ViewHolder {
            SliderLayout sliderLayout;
            LinearLayout rootLinearLayout;
            public SlideItemViewHolder(View recyclerHeader) {
                super(recyclerHeader);
                sliderLayout = (SliderLayout) recyclerHeader.findViewById(R.id.home_slider);
                rootLinearLayout = (LinearLayout) recyclerHeader.findViewById(R.id.rootLinearLayout);
            }

            private void updateHeader() {
                if(Util.isNetworkAvailable(mContext)){
                    for (int i = 0; i < mData.size(); i++) {
                        DefaultSliderView defaultSliderView = new DefaultSliderView(mContext);
                        final int finalI = i;
                        defaultSliderView.image(mData.get(finalI).getImageUrl())
                                .setOnSliderClickListener(new BaseSliderView.OnSliderClickListener() {
                                    @Override
                                    public void onSliderClick(BaseSliderView slider) {
                                        Restaurant restaurantById = Restaurant.searchByRestaurantId(mData.get(finalI).getTargetVendorId());
                                        if(restaurantById != null)
                                            openDetailFragment(restaurantById);
                                    }
                                });
                        sliderLayout.addSlider(defaultSliderView);
                    }
                }


            }

        }


        public void openDetailFragment(Restaurant restaurant) {
            Intent intent = new Intent(mContext, DetailTabActivity.class);
            intent.putExtra(DetailTabActivity.INTENT_RESTAURANT_DATA, restaurant);
            mContext.startActivity(intent);

        }

        public SliderLayout getSliderLayout(){
            return slideItemViewHolder.sliderLayout;
        }
    }

And this adapter is set and updated from this fragment RestaurantFragment.java as:

private void setAdapter()  {
        dismissDialog();
        if (getActivity() != null)
            getActivity().runOnUiThread(new Runnable(){
                @Override
                public void run() {
                    if (restaurantList != null && restaurantList.size() > 0) {
                        restaurantRecyclerView.setVisibility(View.VISIBLE);
                        mEmptyListTextView.setVisibility(View.GONE);
                        restaurentListAdapter = new RestaurantAdapter(getActivity(), restaurantList, mRestaurantType);
                        restaurantRecyclerView.setAdapter(restaurentListAdapter);
                        restaurentListAdapter.updateAdapter(mData);

                        restaurantRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
                            @Override
                            public void onLoadMore(int current_page) {

                                mCurrentPage = mCurrentPage + 1;
                                getHttpResturantData();
                            }
                        });
                    }
                }
            });
    }

Is this much of an explanation helpful or should I paste more code?

Upvotes: 0

Views: 1260

Answers (1)

kha
kha

Reputation: 20033

Based on your code, it's possible to remove the header based on a certain condition.

Adjust your code to cater for the following:

@Override
public int getItemViewType(int position) {
    if(hasHeaeder()) { // where you add the header
        return position == 0 ? RECYCLER_HEADER : RECYCLER_ITEMS;
    } else {  // where you don't add the header
       return RECYCLER_ITEMS;
    }
}

This code also needs changing (currently it's wrong since it doesn't take care of the fact that the header adds 1 to the position).

final Restaurant restaurant = mList.get(i);

Replace it with

final Restaurant restaurant = hasHeader() ? mList.get(i +1) : mList.get(i);

Where hasHeader() is the code you need to write in order to determine whether or not the recycler should contain a header.

Upvotes: 2

Related Questions