Skip to content

Commit

Permalink
移除 SmartAdapter 对 LayoutManger 依赖
Browse files Browse the repository at this point in the history
  • Loading branch information
songhanghang committed Apr 27, 2016
1 parent ed67766 commit a2a9dc1
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public int getItemCount() {
initHeadAndFooterView();

GridLayoutManager linearLayoutManager = new GridLayoutManager(this, 3);
SmartRecyclerAdapter smartRecyclerAdapter = new SmartRecyclerAdapter(adapter, linearLayoutManager);
SmartRecyclerAdapter smartRecyclerAdapter = new SmartRecyclerAdapter(adapter);
smartRecyclerAdapter.setFooterView(footerView);
smartRecyclerAdapter.setHeaderView(headerView);
recyclerView.setLayoutManager(linearLayoutManager);
Expand Down Expand Up @@ -103,7 +103,7 @@ public void switchLayout(View view) {
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
Toast.makeText(this, "LinearLayoutManager", Toast.LENGTH_SHORT).show();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
SmartRecyclerAdapter smartRecyclerAdapter = new SmartRecyclerAdapter(adapter, linearLayoutManager);
SmartRecyclerAdapter smartRecyclerAdapter = new SmartRecyclerAdapter(adapter);
smartRecyclerAdapter.setFooterView(footerView);
smartRecyclerAdapter.setHeaderView(headerView);

Expand All @@ -112,7 +112,7 @@ public void switchLayout(View view) {
} else {
Toast.makeText(this, "GridLayoutManager", Toast.LENGTH_SHORT).show();
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
SmartRecyclerAdapter smartRecyclerAdapter = new SmartRecyclerAdapter(adapter, gridLayoutManager);
SmartRecyclerAdapter smartRecyclerAdapter = new SmartRecyclerAdapter(adapter);
smartRecyclerAdapter.setFooterView(footerView);
smartRecyclerAdapter.setHeaderView(headerView);

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
classpath 'com.android.tools.build:gradle:2.1.0'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;

Expand All @@ -13,11 +14,12 @@ public class SmartRecyclerAdapter extends RecyclerViewAdapterWrapper {
public static final int TYPE_HEADER = 111;
public static final int TYPE_FOOTER = 112;

private RecyclerView.LayoutManager layoutManager;

private View headerView, footerView;

public SmartRecyclerAdapter(@NonNull RecyclerView.Adapter targetAdapter, @NonNull RecyclerView.LayoutManager layoutManager) {
public SmartRecyclerAdapter(@NonNull RecyclerView.Adapter targetAdapter) {
super(targetAdapter);
setGirdSpanSize(layoutManager);
}

public void setHeaderView(View view) {
Expand All @@ -40,7 +42,7 @@ public void removeFooterView() {
getWrappedAdapter().notifyDataSetChanged();
}

private void setGirdSpanSize(RecyclerView.LayoutManager layoutManager) {
private void setGridHeaderFooter(RecyclerView.LayoutManager layoutManager) {
if (layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
Expand All @@ -65,6 +67,13 @@ private boolean hasFooter() {
return footerView != null;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
layoutManager = recyclerView.getLayoutManager();
setGridHeaderFooter(layoutManager);
}

@Override
public int getItemCount() {
return super.getItemCount() + (hasHeader() ? 1 : 0) + (hasFooter() ? 1 : 0);
Expand All @@ -79,18 +88,25 @@ public int getItemViewType(int position) {
if (hasFooter() && position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return super.getItemViewType(hasHeader() ? position - 1: position);
return super.getItemViewType(hasHeader() ? position - 1 : position);
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = null;
if (viewType == TYPE_HEADER) {
return new RecyclerView.ViewHolder(headerView) {
};
itemView = headerView;
} else if (viewType == TYPE_FOOTER) {
itemView = footerView;
}

if (viewType == TYPE_FOOTER) {
return new RecyclerView.ViewHolder(footerView) {
if (itemView != null) {
//set StaggeredGridLayoutManager header & footer view
if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setFullSpan(true);
itemView.setLayoutParams(layoutParams);
}
return new RecyclerView.ViewHolder(itemView) {
};
}
return super.onCreateViewHolder(parent, viewType);
Expand All @@ -99,6 +115,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER || getItemViewType(position) == TYPE_FOOTER) {
//if you need get header & footer state , do here
return;
}
super.onBindViewHolder(holder, hasHeader() ? position - 1 : position);
Expand Down

0 comments on commit a2a9dc1

Please sign in to comment.