-
-
Save ec84b4/d56c00fb5fd2dfaf279b to your computer and use it in GitHub Desktop.
import android.support.v7.widget.RecyclerView; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.Button; | |
import android.widget.TextView; | |
/** | |
* Created by khaled bakhtiari on 10/26/2014. | |
* <a href="http://about.me/kh.bakhtiari"> | |
*/ | |
public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { | |
private static final int TYPE_HEADER = 0; | |
private static final int TYPE_ITEM = 1; | |
String[] data; | |
public HeaderAdapter(String[] data) { | |
this.data = data; | |
} | |
@Override | |
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |
if (viewType == TYPE_ITEM) { | |
//inflate your layout and pass it to view holder | |
return new VHItem(null); | |
} else if (viewType == TYPE_HEADER) { | |
//inflate your layout and pass it to view holder | |
return new VHHeader(null); | |
} | |
throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); | |
} | |
@Override | |
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { | |
if (holder instanceof VHItem) { | |
String dataItem = getItem(position); | |
//cast holder to VHItem and set data | |
} else if (holder instanceof VHHeader) { | |
//cast holder to VHHeader and set data for header. | |
} | |
} | |
@Override | |
public int getItemCount() { | |
return data.length + 1; | |
} | |
@Override | |
public int getItemViewType(int position) { | |
if (isPositionHeader(position)) | |
return TYPE_HEADER; | |
return TYPE_ITEM; | |
} | |
private boolean isPositionHeader(int position) { | |
return position == 0; | |
} | |
private String getItem(int position) { | |
return data[position - 1]; | |
} | |
class VHItem extends RecyclerView.ViewHolder { | |
TextView title; | |
public VHItem(View itemView) { | |
super(itemView); | |
} | |
} | |
class VHHeader extends RecyclerView.ViewHolder { | |
Button button; | |
public VHHeader(View itemView) { | |
super(itemView); | |
} | |
} | |
} |
I am trying to implement with a footer only. The part i'm confused about is how do I tell if the position is the footer? It makes sense with a header because its at position 0, but the position of my footer will keep changing. Any thoughts? Thanks!
position for footer is always getItemCount() -1 (meaning always the las item)
Hi, hister. I successfully used this to create a header (which is basically a refresh progressbar). The issue is I want to hide this header (GONE treatment) but can't seem to make this work. Any suggestion?
@jpshelley, I think you ment the other way around:
@Override
public int getItemCount() {
if (data.isEmpty()) {
return data.length + 1;
} else {
return data.length;
}
}
This will show the header if the data is empty.
What to do if i dnt want header for one Activity and want header in another activity with same adapter
@rafiqlightwala i've had the same problem what i did to solve the issue was to set visibility to gone on every child of the footer (i had a refresh progressbar as well, with a textview and a button)
@mmanishh you could easily send a flag to show the footer or not
or you could have a inheritance of the adapter that doesn't show the footer of course you'd need to tweak the code a bit
The first item for Recyclerview is not displayed . Can u tell why ? and the solution too
How can we implement this with multiple Headers?
Is there a way we can add Accordion behavior to this ?
I would just add that if you don't want the header/footer to be displayed if the data set is empty to change: