// Path: app/src/main/java/com/jaychang/demo/srv/model/Book.java
// public class Book {
// 
//   private long id;
//   private String title;
//   private String author;
//   private Category category;
// 
//   public Book(long id, String title, String author, Category category) {
//     this.id = id;
//     this.title = title;
//     this.author = author;
//     this.category = category;
//   }
// 
//   public long getId() {
//     return id;
//   }
// 
//   public String getTitle() {
//     return title;
//   }
// 
//   public String getAuthor() {
//     return author;
//   }
// 
//   public long getCategoryId() {
//     return category.getId();
//   }
// 
//   public String getCategoryName() {
//     return category.getName();
//   }
// 
//   public void setTitle(String title) {
//     this.title = title;
//   }
// 
//   @Override
//   public String toString() {
//     return title;
//   }
// 
// }
// 
// Path: library/src/main/java/com/jaychang/srv/SimpleCell.java
// public abstract class SimpleCell<T, VH extends SimpleViewHolder> {
// 
//   public interface OnCellClickListener<T> {
//     void onCellClicked(@NonNull T item);
//   }
// 
//   public interface OnCellLongClickListener<T> {
//     void onCellLongClicked(@NonNull T item);
//   }
// 
//   private int spanSize = 1;
//   private T item;
//   private OnCellClickListener onCellClickListener;
//   private OnCellLongClickListener onCellLongClickListener;
// 
//   public SimpleCell(@NonNull T item) {
//     this.item = item;
//   }
// 
//   @LayoutRes protected abstract int getLayoutRes();
// 
//   @NonNull protected abstract VH onCreateViewHolder(@NonNull ViewGroup parent, @NonNull View cellView);
// 
//   protected abstract void onBindViewHolder(@NonNull VH holder, int position, @NonNull Context context, Object payload);
// 
//   protected void onUnbindViewHolder(@NonNull VH holder) {
//   }
// 
//   @NonNull public T getItem() {
//     return item;
//   }
// 
//   public void setItem(@NonNull T item) {
//     this.item = item;
//   }
// 
//   protected long getItemId() {
//     return item.hashCode();
//   }
// 
//   public int getSpanSize() {
//     return spanSize;
//   }
// 
//   public void setSpanSize(int spanSize) {
//     this.spanSize = spanSize;
//   }
// 
//   public void setOnCellClickListener(@NonNull OnCellClickListener<T> onCellClickListener) {
//     this.onCellClickListener = onCellClickListener;
//   }
// 
//   public void setOnCellLongClickListener(@NonNull OnCellLongClickListener<T> onCellLongClickListener) {
//     this.onCellLongClickListener = onCellLongClickListener;
//   }
// 
//   public OnCellClickListener<T> getOnCellClickListener() {
//     return onCellClickListener;
//   }
// 
//   public OnCellLongClickListener<T> getOnCellLongClickListener() {
//     return onCellLongClickListener;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
// 
//     SimpleCell<?, ?> cell = (SimpleCell<?, ?>) o;
// 
//     return getItemId() == cell.getItemId();
// 
//   }
// 
//   @Override
//   public int hashCode() {
//     return (int) (getItemId() ^ (getItemId() >>> 32));
//   }
// 
// }
// 
// Path: library/src/main/java/com/jaychang/srv/SimpleViewHolder.java
// public class SimpleViewHolder extends RecyclerView.ViewHolder {
// 
//   private SimpleCell cell;
// 
//   public SimpleViewHolder(@NonNull View itemView) {
//     super(itemView);
//   }
// 
//   void bind(SimpleCell cell) {
//     this.cell = cell;
//   }
// 
//   void unbind() {
//     cell = null;
//   }
// 
//   SimpleCell getCell() {
//     return cell;
//   }
// 
// }
// 
// Path: library/src/main/java/com/jaychang/srv/Updatable.java
// public interface Updatable<T> {
// 
//   boolean areContentsTheSame(@NonNull T newItem);
// 
//   Object getChangePayload(@NonNull T newItem);
// 
// }


import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.jaychang.demo.srv.R;
import com.jaychang.demo.srv.model.Book;
import com.jaychang.srv.SimpleCell;
import com.jaychang.srv.SimpleViewHolder;
import com.jaychang.srv.Updatable;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
package com.jaychang.demo.srv.cell;





public class BookCell extends SimpleCell<Book, BookCell.ViewHolder>
  implements Updatable<Book> {

  private static final String KEY_TITLE = "KEY_TITLE";
  private boolean showHandle;

  public BookCell(Book item) {
    super(item);
  }

  @Override
  protected int getLayoutRes() {
    return R.layout.cell_book;
  }

  @NonNull
  @Override
  protected ViewHolder onCreateViewHolder(ViewGroup parent, View cellView) {
    return new ViewHolder(cellView);
  }

  @Override
  protected void onBindViewHolder(ViewHolder holder, int position, Context context, Object payload) {
    if (payload != null) {
      // payload from updateCell()
      if (payload instanceof Book) {
// Path: app/src/main/java/com/jaychang/demo/srv/model/Book.java
// public class Book {
// 
//   private long id;
//   private String title;
//   private String author;
//   private Category category;
// 
//   public Book(long id, String title, String author, Category category) {
//     this.id = id;
//     this.title = title;
//     this.author = author;
//     this.category = category;
//   }
// 
//   public long getId() {
//     return id;
//   }
// 
//   public String getTitle() {
//     return title;
//   }
// 
//   public String getAuthor() {
//     return author;
//   }
// 
//   public long getCategoryId() {
//     return category.getId();
//   }
// 
//   public String getCategoryName() {
//     return category.getName();
//   }
// 
//   public void setTitle(String title) {
//     this.title = title;
//   }
// 
//   @Override
//   public String toString() {
//     return title;
//   }
// 
// }
// 
// Path: library/src/main/java/com/jaychang/srv/SimpleCell.java
// public abstract class SimpleCell<T, VH extends SimpleViewHolder> {
// 
//   public interface OnCellClickListener<T> {
//     void onCellClicked(@NonNull T item);
//   }
// 
//   public interface OnCellLongClickListener<T> {
//     void onCellLongClicked(@NonNull T item);
//   }
// 
//   private int spanSize = 1;
//   private T item;
//   private OnCellClickListener onCellClickListener;
//   private OnCellLongClickListener onCellLongClickListener;
// 
//   public SimpleCell(@NonNull T item) {
//     this.item = item;
//   }
// 
//   @LayoutRes protected abstract int getLayoutRes();
// 
//   @NonNull protected abstract VH onCreateViewHolder(@NonNull ViewGroup parent, @NonNull View cellView);
// 
//   protected abstract void onBindViewHolder(@NonNull VH holder, int position, @NonNull Context context, Object payload);
// 
//   protected void onUnbindViewHolder(@NonNull VH holder) {
//   }
// 
//   @NonNull public T getItem() {
//     return item;
//   }
// 
//   public void setItem(@NonNull T item) {
//     this.item = item;
//   }
// 
//   protected long getItemId() {
//     return item.hashCode();
//   }
// 
//   public int getSpanSize() {
//     return spanSize;
//   }
// 
//   public void setSpanSize(int spanSize) {
//     this.spanSize = spanSize;
//   }
// 
//   public void setOnCellClickListener(@NonNull OnCellClickListener<T> onCellClickListener) {
//     this.onCellClickListener = onCellClickListener;
//   }
// 
//   public void setOnCellLongClickListener(@NonNull OnCellLongClickListener<T> onCellLongClickListener) {
//     this.onCellLongClickListener = onCellLongClickListener;
//   }
// 
//   public OnCellClickListener<T> getOnCellClickListener() {
//     return onCellClickListener;
//   }
// 
//   public OnCellLongClickListener<T> getOnCellLongClickListener() {
//     return onCellLongClickListener;
//   }
// 
//   @Override
//   public boolean equals(Object o) {
//     if (this == o) return true;
//     if (o == null || getClass() != o.getClass()) return false;
// 
//     SimpleCell<?, ?> cell = (SimpleCell<?, ?>) o;
// 
//     return getItemId() == cell.getItemId();
// 
//   }
// 
//   @Override
//   public int hashCode() {
//     return (int) (getItemId() ^ (getItemId() >>> 32));
//   }
// 
// }
// 
// Path: library/src/main/java/com/jaychang/srv/SimpleViewHolder.java
// public class SimpleViewHolder extends RecyclerView.ViewHolder {
// 
//   private SimpleCell cell;
// 
//   public SimpleViewHolder(@NonNull View itemView) {
//     super(itemView);
//   }
// 
//   void bind(SimpleCell cell) {
//     this.cell = cell;
//   }
// 
//   void unbind() {
//     cell = null;
//   }
// 
//   SimpleCell getCell() {
//     return cell;
//   }
// 
// }
// 
// Path: library/src/main/java/com/jaychang/srv/Updatable.java
// public interface Updatable<T> {
// 
//   boolean areContentsTheSame(@NonNull T newItem);
// 
//   Object getChangePayload(@NonNull T newItem);
// 
// }


// Path: app/src/main/java/com/jaychang/demo/srv/cell/BookCell.java
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.jaychang.demo.srv.R;
import com.jaychang.demo.srv.model.Book;
import com.jaychang.srv.SimpleCell;
import com.jaychang.srv.SimpleViewHolder;
import com.jaychang.srv.Updatable;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;

package com.jaychang.demo.srv.cell;





public class BookCell extends SimpleCell<Book, BookCell.ViewHolder>
  implements Updatable<Book> {

  private static final String KEY_TITLE = "KEY_TITLE";
  private boolean showHandle;

  public BookCell(Book item) {
    super(item);
  }

  @Override
  protected int getLayoutRes() {
    return R.layout.cell_book;
  }

  @NonNull
  @Override
  protected ViewHolder onCreateViewHolder(ViewGroup parent, View cellView) {
    return new ViewHolder(cellView);
  }

  @Override
  protected void onBindViewHolder(ViewHolder holder, int position, Context context, Object payload) {
    if (payload != null) {
      // payload from updateCell()
      if (payload instanceof Book) {
        holder.textView.setText(((Book) payload).getTitle());