I am trying to set header for every item but getting crash.
Attempt to invoke virtual method 'int org.zakariya.stickyheaders.SectioningAdapter.getItemViewType(int)' on a null object reference at org.zakariya.stickyheaders.StickyHeaderLayoutManager.getViewType(StickyHeaderLayoutManager.java:590)
public class AdapterTimeline extends SectioningAdapter {
public ArrayList<Video> results;
private LeadActionView.onClickListener listener;
public AdapterTimeline(ArrayList<Video> results) {
this.results = results;
}
@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent) {
return new ItemHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false), parent.getContext(), listener);
}
@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
return new HeaderHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.header_view_timeline, parent, false), parent.getContext());
}
@Override
public void onBindHeaderViewHolder(HeaderViewHolder holder, int position) {
super.onBindHeaderViewHolder(holder, position);
if (results.size() == 0)
return;
Video item = results.get(position);
HeaderHolder vh = (HeaderHolder) holder;
vh.itemContainerView.setTag(item);
vh.profileImage.setTag(item.owner.uuid);
GlideLoader(vh.profileImage, item.owner.avatar_url_small);
vh.username.setText(item.owner.username);
vh.date.setText(DateUtils.parse(item.created_at, item.publish_date));
}
@Override
public void onBindItemViewHolder(ItemViewHolder holder, int sectionIndex, int position) {
super.onBindItemViewHolder(holder, sectionIndex, position);
if (results.size() == 0)
return;
Video item = results.get(position);
final ItemHolder vh = (ItemHolder) holder;
GlideLoader(vh.placeHolder, item.thumbnail_small_url);
vh.actionView.setItem(item, position);
vh.explain.setText(item.description);
vh.placeHolder.setTag(item.video_url);
if (item.video_url == null)
vh.imageNotYet.setVisibility(View.VISIBLE);
else
vh.imageNotYet.setVisibility(View.GONE);
vh.placeHolder.setVisibility(View.VISIBLE);
vh.scalableView.setVisibility(View.GONE);
vh.setItem(item);
HashTagHelper.Creator.create(vh.getContext().getResources().getColor(android.R.color.black), new HashTagHelper.OnHashTagClickListener() {
@Override
public void onHashTagClicked(String hashTag) {
vh.getContext().startActivity(new Intent(vh.getContext(), ActivityHashTag.class).putExtra(Common.HASH_TAG, hashTag));
}
}).handle(vh.explain);
}
@Override
public int getNumberOfSections() {
return (null != results ? results.size() : 0);
}
@Override
public int getNumberOfItemsInSection(int sectionIndex) {
return 1;
}
@Override
public boolean doesSectionHaveHeader(int sectionIndex) {
return true;
}
@Override
public boolean doesSectionHaveFooter(int sectionIndex) {
return false;
}
@Override
public void onViewAttachedToWindow(ViewHolder holder) {
super.onViewAttachedToWindow(holder);
// ItemHolder itemHolder = (ItemHolder) holder;
// itemHolder.scalableView.finish();
}
public class HeaderHolder extends SectioningAdapter.HeaderViewHolder implements View.OnClickListener {
final Context context;
LeadTextView date;
CircleImageView profileImage;
LeadTextView username;
LinearLayout itemContainerView;
public HeaderHolder(View itemView, Context context) {
super(itemView);
this.context = context;
itemContainerView = (LinearLayout) itemView.findViewById(R.id.item_view_container);
profileImage = (CircleImageView) itemView.findViewById(R.id.profile_image_timeline);
profileImage.setOnClickListener(this);
username = (LeadTextView) itemView.findViewById(R.id.user_name);
date = (LeadTextView) itemView.findViewById(R.id.post_date);
}
public Context getContext() {
return context;
}
@Override
public void onClick(View v) {
context.startActivity(new Intent(context, ActivityProfile.class).putExtra(ActivityProfile.PROFILE_UUID, ((String) v.getTag())));
}
}
public class ItemHolder extends SectioningAdapter.ItemViewHolder implements View.OnClickListener {
final Context context;
LeadActionView actionView;
SquareImageView placeHolder;
LeadTextView explain;
ScalableView scalableView;
ImageView mediaPlayer;
AnimationSet animationSet;
CircleImageView imageNotYet;
private Video item;
public ItemHolder(View itemView, Context context, LeadActionView.onClickListener listener) {
super(itemView);
this.context = context;
scalableView = (ScalableView) itemView.findViewById(R.id.scalableVideoView);
actionView = (LeadActionView) itemView.findViewById(R.id.actionView);
actionView.setOnClickListener(listener);
placeHolder = (SquareImageView) itemView.findViewById(R.id.place_holder);
imageNotYet = (CircleImageView) itemView.findViewById(R.id.image_not_yet);
placeHolder.setMaxHeight(itemView.getWidth());
placeHolder.setOnClickListener(this);
scalableView.setOnClickListener(this);
explain = (LeadTextView) itemView.findViewById(R.id.explain);
mediaPlayer = (ImageView) itemView.findViewById(R.id.button_media_player);
}
public Context getContext() {
return context;
}
@Override
public void onClick(View v) {
if (!scalableView.isPrepared() && item.video_url != null) {
animationSet = startAnimation(mediaPlayer);
scalableView.prepareAsync(item, new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
scalableView.setPrepared(true);
if (animationSet != null)
animationSet.cancel();
scalableView.post(new Runnable() {
@Override
public void run() {
scalableView.setVisibility(View.VISIBLE);
}
});
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
placeHolder.setVisibility(View.VISIBLE);
scalableView.setVisibility(View.GONE);
scalableView.finish();
}
});
scalableView.start();
placeHolder.setVisibility(View.GONE);
}
});
} else if (scalableView.isPlaying()) {
scalableView.pause();
} else if (scalableView.isPaused())
scalableView.start();
}
private AnimationSet startAnimation(ImageView mediaPlayer) {
Animation fadeIn = new AlphaAnimation(0, 1);
fadeIn.setInterpolator(new DecelerateInterpolator());
fadeIn.setDuration(900);
Animation fadeOut = new AlphaAnimation(1, 0);
fadeOut.setInterpolator(new AccelerateInterpolator());
fadeOut.setStartOffset(1000);
fadeOut.setDuration(900);
AnimationSet animation = new AnimationSet(false);
animation.addAnimation(fadeIn);
animation.addAnimation(fadeOut);
mediaPlayer.setAnimation(animation);
mediaPlayer.startAnimation(animation);
return animation;
}
public void setItem(Video item) {
this.item = item;
}
public Video getItem() {
return item;
}
}
public void setListener(LeadActionView.onClickListener listener) {
this.listener = listener;
}
private void GlideLoader(final ImageView targetImageView, final String url) {
Glide.with(targetImageView.getContext())
.load(url)
.dontAnimate().into(targetImageView);
}
}
mAdapter = new AdapterTimeline(results);
mAdapter.setListener(this);
mLayoutManager = new StickyHeaderLayoutManager();
mRecyclerView.setLayoutManager(mLayoutManager);
mLayoutManager.setHeaderPositionChangedCallback(new StickyHeaderLayoutManager.HeaderPositionChangedCallback() {
@Override
public void onHeaderPositionChanged(int sectionIndex, View header, StickyHeaderLayoutManager.HeaderPosition oldPosition, StickyHeaderLayoutManager.HeaderPosition newPosition) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
boolean elevated = newPosition == StickyHeaderLayoutManager.HeaderPosition.STICKY;
header.setElevation(elevated ? 8 : 0);
}
}
});
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);