Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Wednesday, August 31, 2016

RecyclerView header and footer

RecyclerView header and footer


Maybe this question has been asked before, but I could not seem to find a precise answer or solution. I started using the RecyclerView, and I implemented it using the LinearLayoutManager. Now I want to add custom header and footer items, that differ from the rest of the items in my RecyclerView. The header and footer should not be sticky, I want them to scroll with the rest of the items. Can somebody point out some example how to do this or just share ideas. I will appreciate it very much. Thx

Answer by Bronx for RecyclerView header and footer


in your adapter add this class:

private class VIEW_TYPES {          public static final int Header = 1;          public static final int Normal = 2;          public static final int Footer = 3;  }  

then Override the following method like this:

@Override  public int getItemViewType(int position) {        if(items.get(position).isHeader)          return VIEW_TYPES.Header;      else if(items.get(position).isFooter)          return VIEW_TYPES.Footer;      else          return VIEW_TYPES.Normal;    }  

Now in the onCreateViewHolder method inflate your layout based on the view type::

@Override  public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {        View rowView;        switch (i)      {          case VIEW_TYPES.Normal:              rowView=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.normal, viewGroup, false);              break;          case VIEW_TYPES.Header:              rowView=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header, viewGroup, false);              break;          case VIEW_TYPES.Footer:              rowView=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.footer, viewGroup, false);              break;          default:              rowView=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.normal, viewGroup, false);              break;      }      return new ViewHolder (rowView);  }  

Hope this can help.

Answer by F.Will for RecyclerView header and footer


Click here. I did a extension of RecyclerView.Adapter. Easy to add header and footer.

class HFAdapter extends HFRecyclerViewAdapter{        public HFAdapter(Context context) {          super(context);      }        @Override      public DataViewHolder onCreateDataItemViewHolder(ViewGroup parent, int viewType) {          View v = LayoutInflater.from(parent.getContext())                  .inflate(R.layout.data_item, parent, false);          return new DataViewHolder(v);      }        @Override      public void onBindDataItemViewHolder(DataViewHolder holder, int position) {          holder.itemTv.setText(getData().get(position));      }        class DataViewHolder extends RecyclerView.ViewHolder{          TextView itemTv;          public DataViewHolder(View itemView) {              super(itemView);              itemTv = (TextView)itemView.findViewById(R.id.itemTv);          }      }  }    //add header  View headerView = LayoutInflater.from(this).inflate(R.layout.header, recyclerView, false);  hfAdapter.setHeaderView(headerView);  //add footer  View footerView = LayoutInflater.from(this).inflate(R.layout.footer, recyclerView, false);  hfAdapter.setFooterView(footerView);    //remove  hfAdapter.removeHeader();  hfAdapter.removeFooter();  

Answer by David Medenjak for RecyclerView header and footer


This is very easy with ItemDecorations and without modifying any other code:

recyclerView.addItemDecoration(new HeaderDecoration(this,                                 recyclerView,  R.layout.test_header));  

Reserve some space for drawing, inflate the layout you want drawn and draw it in the reserved space.

The code for the Decoration:

public class HeaderDecoration extends RecyclerView.ItemDecoration {        private View mLayout;        public HeaderDecoration(final Context context, RecyclerView parent, @LayoutRes int resId) {          // inflate and measure the layout          mLayout = LayoutInflater.from(context).inflate(resId, parent, false);          mLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),                  View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));      }          @Override      public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {          super.onDraw(c, parent, state);          // layout basically just gets drawn on the reserved space on top of the first view          mLayout.layout(parent.getLeft(), 0, parent.getRight(), mLayout.getMeasuredHeight());          for (int i = 0; i <
parent.getChildCount(); i++) { View view = parent.getChildAt(i); if (parent.getChildAdapterPosition(view) == 0) { c.save(); final int height = mLayout.getMeasuredHeight(); final int top = view.getTop() - height; c.translate(0, top); mLayout.draw(c); c.restore(); break; } } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (parent.getChildAdapterPosition(view) == 0) { outRect.set(0, mLayout.getMeasuredHeight(), 0, 0); } else { outRect.setEmpty(); } } }

Answer by lopez.mikhael for RecyclerView header and footer


You can use this GitHub] library to add a Header or Footer to your RecyclerView in the simplest way possible.

You need to add the HFRecyclerView library in your project or you can also grab it from Gradle:

compile 'com.mikhaellopez:hfrecyclerview:1.0.0'  

This library is based on a work at @hister

This is a result in image:

Preview

Answer by Gustavo for RecyclerView header and footer


You can use the library SectionedRecyclerViewAdapter, it has the concept of "Sections", where which Section has a Header, Footer and Content (list of items). In your case you might only need one Section but you can have many:

enter image description here

1) Create a custom Section class:

class MySection extends StatelessSection {        List myList = Arrays.asList(new String[] {"Item1", "Item2", "Item3" });        public MySection() {          // call constructor with layout resources for this Section header, footer and items           super(R.layout.section_header, R.layout.section_footer,  R.layout.section_item);      }        @Override      public int getContentItemsTotal() {          return myList.size(); // number of items of this section      }        @Override      public RecyclerView.ViewHolder getItemViewHolder(View view) {          // return a custom instance of ViewHolder for the items of this section          return new MyItemViewHolder(view);      }        @Override      public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {          MyItemViewHolder itemHolder = (MyItemViewHolder) holder;            // bind your view here          itemHolder.tvItem.setText(myList.get(position));      }  }  

2) Create a custom ViewHolder for the items:

class MyItemViewHolder extends RecyclerView.ViewHolder {        private final TextView tvItem;        public MyItemViewHolder(View itemView) {          super(itemView);            tvItem = (TextView) itemView.findViewById(R.id.tvItem);      }  }  

3) Set up your ReclyclerView with the SectionedRecyclerViewAdapter

// Create an instance of SectionedRecyclerViewAdapter   SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();    MySection mySection = new MySection();    // Add your Sections  sectionAdapter.addSection(mySection);    // Set up your RecyclerView with the SectionedRecyclerViewAdapter  RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);  recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));  recyclerView.setAdapter(sectionAdapter);  

Answer by Xiong for RecyclerView header and footer


May be GroupAdapter is what you want.

A specialized RecyclerView.Adapter that presents data from a sequence of RecyclerView.Adapter. The sequence is static but each adapter can be presented in zero or more item views. The child adapter can use ViewType safely. In addition, we can addHeaderView or addFooterView like ListView.

Answer by Harpreet for RecyclerView header and footer


For Sectioned LinearView headings with GridView items in Recyclerview:-

Check SectionedGridRecyclerViewAdapter

enter image description here


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

Related Posts:

0 comments:

Post a Comment

Popular Posts

Fun Page

Powered by Blogger.