diff --git a/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MainActivity.java b/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MainActivity.java index 3191c5d..f53f63c 100644 --- a/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MainActivity.java +++ b/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MainActivity.java @@ -10,7 +10,6 @@ import com.github.zeng1990java.commonadapter.CommonRecyclerAdapter; import com.github.zeng1990java.commonadapter.ViewBinder; -import com.github.zeng1990java.commonadapter.ViewHolder; import java.util.ArrayList; import java.util.List; @@ -34,10 +33,14 @@ protected void onCreate(Bundle savedInstanceState) { // mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)); // 单布局使用 - mRecyclerView.setAdapter(mCommonRecyclerAdapter = new CommonRecyclerAdapter(this, R.layout.item_view, getDatas()) { + mRecyclerView.setAdapter(mCommonRecyclerAdapter = new CommonRecyclerAdapter(this, getDatas()) { @Override - public void bindData(ViewHolder holder, String data, int position) { - holder.viewBinder().setText(R.id.text, data + " position: "+position); + public void bindData(ViewBinder binder, String data) { + binder.setText(R.id.text, data + " position: "+binder.getPosition()); + } + @Override + public int getItemLayoutResId(String data, int position) { + return R.layout.item_view; } }); @@ -75,7 +78,7 @@ public void onClick(View v) { // 设置item点击事件 mCommonRecyclerAdapter.setOnItemClickListener(new CommonRecyclerAdapter.OnItemClickListener() { @Override - public void onItemClick(ViewHolder holder, int position) { + public void onItemClick(ViewBinder binder) { MultiTypeActivity.start(MainActivity.this); } }); @@ -83,8 +86,8 @@ public void onItemClick(ViewHolder holder, int position) { // 设置item长按事件 mCommonRecyclerAdapter.setOnItemLongClickListener(new CommonRecyclerAdapter.OnItemLongClickListener() { @Override - public boolean onItemLongClick(ViewHolder holder, int position) { - mCommonRecyclerAdapter.set(position, "Item Long Click "+position); + public boolean onItemLongClick(ViewBinder binder) { + mCommonRecyclerAdapter.set(binder.getPosition(), "Item Long Click "+binder.getPosition()); return true; } }); diff --git a/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MultiTypeActivity.java b/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MultiTypeActivity.java index 3f79548..53c393b 100644 --- a/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MultiTypeActivity.java +++ b/commonadapter-sample/src/main/java/com/github/zeng1990java/commonadapter_sample/MultiTypeActivity.java @@ -10,7 +10,7 @@ import android.widget.Toast; import com.github.zeng1990java.commonadapter.CommonRecyclerAdapter; -import com.github.zeng1990java.commonadapter.ViewHolder; +import com.github.zeng1990java.commonadapter.ViewBinder; import com.github.zeng1990java.commonadapter_sample.bean.News; import com.github.zeng1990java.commonadapter_sample.consts.Consts; import com.github.zeng1990java.commonadapter_sample.data.NewDataSource; @@ -41,8 +41,8 @@ protected void onCreate(Bundle savedInstanceState) { mNewsAdapter.setOnItemClickListener(new CommonRecyclerAdapter.OnItemClickListener() { @Override - public void onItemClick(ViewHolder holder, int position) { - News news = mNewsAdapter.getItem(position); + public void onItemClick(ViewBinder binder) { + News news = mNewsAdapter.getItem(binder.getPosition()); Toast.makeText(MultiTypeActivity.this, news.getTitle(), Toast.LENGTH_SHORT).show(); } }); @@ -53,7 +53,7 @@ public void onItemClick(ViewHolder holder, int position) { private class NewsAdapter extends CommonRecyclerAdapter{ public NewsAdapter(@NonNull Context context) { - super(context, 0); + super(context); } @Override @@ -74,10 +74,10 @@ public int getItemLayoutResId(News data, int position) { } @Override - public void bindData(ViewHolder holder, News data, int position) { + public void bindData(ViewBinder binder, News data) { switch (data.getNewsType()){ case News.TYPE_NONE_PICTURE: - holder.viewBinder().setText(R.id.item_none_picture_title, data.getTitle()) + binder.setText(R.id.item_none_picture_title, data.getTitle()) .setText(R.id.item_none_picture_author, String.format(Locale.CHINA, Consts.FORMAT_AUTHOR, data.getAuthor())) .setText(R.id.item_none_picture_date, @@ -85,7 +85,7 @@ public void bindData(ViewHolder holder, News data, int position) { .setText(R.id.item_none_picture_intro, data.getIntro()); break; case News.TYPE_SINGLE_PICTURE: - holder.viewBinder().setText(R.id.item_single_picture_title, data.getTitle()) + binder.setText(R.id.item_single_picture_title, data.getTitle()) .setText(R.id.item_single_picture_author, String.format(Locale.CHINA, Consts.FORMAT_AUTHOR, data.getAuthor())) .setText(R.id.item_single_picture_date, @@ -94,7 +94,7 @@ public void bindData(ViewHolder holder, News data, int position) { break; case News.TYPE_MULTIPLE_PICTURE: String[] urls = data.getCoverUrl().split(Consts.URL_SEPARATOR); - holder.viewBinder().setText(R.id.item_multiple_picture_intro, data.getIntro()) + binder.setText(R.id.item_multiple_picture_intro, data.getIntro()) .setImageUrl(R.id.item_multiple_picture_cover_left,urls[0]) .setImageUrl(R.id.item_multiple_picture_cover_right, urls[1]); break; diff --git a/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/CommonRecyclerAdapter.java b/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/CommonRecyclerAdapter.java index 2c1d454..0281ec5 100644 --- a/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/CommonRecyclerAdapter.java +++ b/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/CommonRecyclerAdapter.java @@ -24,19 +24,22 @@ public abstract class CommonRecyclerAdapter extends RecyclerView.Adapter { public interface OnItemClickListener{ - void onItemClick(ViewHolder holder, int position); + void onItemClick(ViewBinder binder); } public interface OnItemLongClickListener{ - boolean onItemLongClick(ViewHolder holder, int position); + boolean onItemLongClick(ViewBinder binder); } public interface OnLoadMoreListener{ void onLoadMore(); } + private static final int TYPE_HEADER = -1; + private static final int TYPE_FOOTER = -2; + private static final int TYPE_LOADMORE = -3; + private Context mContext; - private int mLayoutId; private List mDatas; private LayoutInflater mInflater; @@ -69,13 +72,12 @@ public void setLoadMoreLayoutId(int loadMoreLayoutId) { mLoadMoreLayoutId = loadMoreLayoutId; } - public CommonRecyclerAdapter(@NonNull Context context, int layoutId){ - this(context, layoutId, new ArrayList()); + public CommonRecyclerAdapter(@NonNull Context context){ + this(context, new ArrayList()); } - public CommonRecyclerAdapter(@NonNull Context context, int layoutId, @NonNull List datas){ + public CommonRecyclerAdapter(@NonNull Context context, @NonNull List datas){ mContext = context; - mLayoutId = layoutId; mDatas = datas; mInflater = LayoutInflater.from(mContext); mLoadMoreLayoutId = AdapterConfig.getInstance().getLoadingLayoutId(); @@ -198,27 +200,36 @@ public int getSpanSize(int position) { } } - @Override - public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == R.layout.adapter_view_header_layout){ - return new ViewHolder(mHeaderLayout); - } - - if (viewType == R.layout.adapter_view_footer_layout){ - return new ViewHolder(mFooterLayout); - } + private int getRealPosition(int position) { + return position - getHeaderViewItemCount(); + } - if (viewType == R.layout.adapter_view_load_layout){ - View itemView = inflateItemView(parent, mLoadMoreLayoutId); - return new ViewHolder(itemView); + @Override + public final ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ViewHolder holder; + switch (viewType) { + case TYPE_HEADER: + holder = new ViewHolder(mHeaderLayout); + break; + case TYPE_FOOTER: + holder = new ViewHolder(mFooterLayout); + break; + case TYPE_LOADMORE: + View loadmoreView = inflateItemView(parent, mLoadMoreLayoutId); + holder = new ViewHolder(loadmoreView); + break; + default: + int layoutId = viewType; + View itemView = inflateItemView(parent, layoutId); + ViewBinder viewBinder = createViewBinder(itemView); + holder = new ViewHolder(viewBinder); + break; } - View itemView = inflateItemView(parent, viewType); - ViewBinder viewBinder = createViewBinder(itemView); - return new ViewHolder(itemView, viewBinder); + return holder; } @Override - public void onBindViewHolder(final ViewHolder holder, int position) { + public final void onBindViewHolder(ViewHolder holder, int position) { if (isHeader(position) || isFooter(position)){ return; } @@ -233,46 +244,47 @@ public void onBindViewHolder(final ViewHolder holder, int position) { return; } - final int dataPosition = position - getHeaderViewItemCount(); + final int dataPosition = getRealPosition(position); + final ViewBinder binder = holder.viewBinder(); + binder.setPosition(dataPosition); - holder.itemView.setOnClickListener(new View.OnClickListener() { + binder.getView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null){ - mOnItemClickListener.onItemClick(holder, dataPosition); + mOnItemClickListener.onItemClick(binder); } } }); - holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { + binder.getView().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { - if (mOnItemLongClickListener != null){ - return mOnItemLongClickListener.onItemLongClick(holder, dataPosition); - } - return false; + return mOnItemLongClickListener != null + && mOnItemLongClickListener.onItemLongClick(binder); } }); - bindData(holder, getItem(dataPosition), dataPosition); + bindData(binder, getItem(dataPosition)); } - public abstract void bindData(ViewHolder holder, T data, int position); + public abstract void bindData(ViewBinder binder, T data); @Override - public int getItemViewType(int position) { + public final int getItemViewType(int position) { if (isHeader(position)){ - return R.layout.adapter_view_header_layout; + return TYPE_HEADER; } if (isFooter(position)){ - return R.layout.adapter_view_footer_layout; + return TYPE_FOOTER; } if (isLoadMore(position)){ - return R.layout.adapter_view_load_layout; + return TYPE_LOADMORE; } - int dataPosition = position - getHeaderViewItemCount(); + + int dataPosition = getRealPosition(position); return getItemLayoutResId(getItem(dataPosition), dataPosition); } @@ -288,9 +300,7 @@ protected View inflateItemView(ViewGroup parent, int layoutId){ return mInflater.inflate(layoutId, parent, false); } - public int getItemLayoutResId(T data, int position){ - return mLayoutId; - } + public abstract int getItemLayoutResId(T data, int position); public T getItem(int position){ return mDatas.get(position); @@ -350,7 +360,6 @@ public void replaceAll(@NonNull List datas){ // 遍历新列表,对旧列表数据进行更新,增加,删除 for (int indexNew = 0; indexNew < datas.size(); indexNew++) { - T item = datas.get(indexNew); int indexOld = mDatas.indexOf(item); if (indexOld == -1){ @@ -442,20 +451,14 @@ private int getLoadMoreViewItemCount(){ return hasLoadMoreView() ? 1 : 0; } - private boolean hasHeaderView(){ - if (mHeaderLayout == null){ - return false; - } - - return mHeaderLayout.getChildCount() > 0; + private boolean hasHeaderView() { + return mHeaderLayout != null + && mHeaderLayout.getChildCount() > 0; } - private boolean hasFooterView(){ - if(mFooterLayout == null){ - return false; - } - - return mFooterLayout.getChildCount() > 0; + private boolean hasFooterView() { + return mFooterLayout != null + && mFooterLayout.getChildCount() > 0; } private boolean hasLoadMoreView(){ diff --git a/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewBinder.java b/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewBinder.java index 5788a55..f24a211 100644 --- a/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewBinder.java +++ b/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewBinder.java @@ -35,6 +35,7 @@ public class ViewBinder { private Context mContext; private View mItemView; private AdapterImageLoader mImageLoader; + private int mPosition; private ViewBinder(Context context, View itemView){ this(context, itemView, AdapterConfig.getInstance().getImageLoader()); @@ -62,6 +63,14 @@ public static ViewBinder create(Context context, View itemView, AdapterImageLoad return new ViewBinder(context, itemView, imageLoader); } + public int getPosition() { + return mPosition; + } + + void setPosition(int position) { + this.mPosition = position; + } + /** * This method allows you to retrieve a view and perform custom * operations on it, not covered by the BaseAdapterHelper. diff --git a/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewHolder.java b/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewHolder.java index edf53e2..28e5371 100644 --- a/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewHolder.java +++ b/commonadapter/src/main/java/com/github/zeng1990java/commonadapter/ViewHolder.java @@ -9,7 +9,7 @@ * @author zxb * @date 16/7/16 下午11:31 */ -public class ViewHolder extends RecyclerView.ViewHolder { +class ViewHolder extends RecyclerView.ViewHolder { private ViewBinder mViewBinder; @@ -18,8 +18,8 @@ public ViewHolder(View itemView) { mViewBinder = ViewBinder.create(itemView); } - public ViewHolder(View itemView, ViewBinder viewBinder){ - super(itemView); + public ViewHolder(ViewBinder viewBinder){ + super(viewBinder.getView()); mViewBinder = viewBinder; }