forked from youth5201314/banner
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c5ed3d5
commit 0b57cee
Showing
11 changed files
with
320 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package com.test.banner; | ||
|
||
import android.support.v7.widget.RecyclerView; | ||
import android.view.Gravity; | ||
import android.view.ViewGroup; | ||
import android.widget.TextView; | ||
|
||
|
||
public class SampleAdapter extends RecyclerView.Adapter<SampleAdapter.ViewHolder> { | ||
|
||
private static final int NUM_ITEMS = 30; | ||
|
||
private String[] mDataset; | ||
|
||
public static class ViewHolder extends RecyclerView.ViewHolder { | ||
private TextView mTextView; | ||
public ViewHolder(TextView v) { | ||
super(v); | ||
mTextView = v; | ||
} | ||
} | ||
|
||
public SampleAdapter() { | ||
mDataset = new String[NUM_ITEMS]; | ||
for (int i = 0; i < NUM_ITEMS; i++) { | ||
mDataset[i] = String.valueOf(i); | ||
} | ||
} | ||
|
||
@Override | ||
public SampleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, | ||
int viewType) { | ||
TextView textView = new TextView(parent.getContext()); | ||
textView.setTextSize(16f); | ||
textView.setGravity(Gravity.CENTER); | ||
textView.setPadding(10,10,10,10); | ||
return new ViewHolder(textView); | ||
} | ||
|
||
@Override | ||
public void onBindViewHolder(ViewHolder holder, int position) { | ||
holder.mTextView.setText("This is item " + mDataset[position]); | ||
} | ||
|
||
@Override | ||
public int getItemCount() { | ||
return mDataset.length; | ||
} | ||
} |
172 changes: 172 additions & 0 deletions
172
app/src/main/java/com/test/banner/common/BaseRecyclerAdapter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
package com.test.banner.common; | ||
|
||
import android.support.annotation.NonNull; | ||
import android.support.v7.widget.RecyclerView; | ||
import android.view.View; | ||
import android.view.ViewGroup; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
|
||
public class BaseRecyclerAdapter<T extends RecyclerView.Adapter> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { | ||
|
||
private final T mBase; | ||
|
||
/** | ||
* Defines available view type integers for headers and footers. | ||
* | ||
* How this works: | ||
* - Regular views use view types starting from 0, counting upwards | ||
* - Header views use view types starting from -1000, counting upwards | ||
* - Footer views use view types starting from -2000, counting upwards | ||
* | ||
* This means that you're safe as long as the base adapter doesn't use negative view types, | ||
* and as long as you have fewer than 1000 headers and footers | ||
*/ | ||
private static final int HEADER_VIEW_TYPE = -1000; | ||
private static final int FOOTER_VIEW_TYPE = -2000; | ||
|
||
private final List<View> mHeaders = new ArrayList<View>(); | ||
private final List<View> mFooters = new ArrayList<View>(); | ||
|
||
/** | ||
* Constructor. | ||
* | ||
* @param base | ||
* the adapter to wrap | ||
*/ | ||
public BaseRecyclerAdapter(T base) { | ||
super(); | ||
mBase = base; | ||
} | ||
|
||
/** | ||
* Gets the base adapter that this is wrapping. | ||
*/ | ||
public T getWrappedAdapter() { | ||
return mBase; | ||
} | ||
|
||
/** | ||
* Adds a header view. | ||
*/ | ||
public void addHeader(@NonNull View view) { | ||
if (view == null) { | ||
throw new IllegalArgumentException("You can't have a null header!"); | ||
} | ||
mHeaders.add(view); | ||
} | ||
|
||
/** | ||
* Adds a footer view. | ||
*/ | ||
public void addFooter(@NonNull View view) { | ||
if (view == null) { | ||
throw new IllegalArgumentException("You can't have a null footer!"); | ||
} | ||
mFooters.add(view); | ||
} | ||
|
||
/** | ||
* Toggles the visibility of the header views. | ||
*/ | ||
public void setHeaderVisibility(boolean shouldShow) { | ||
for (View header : mHeaders) { | ||
header.setVisibility(shouldShow ? View.VISIBLE : View.GONE); | ||
} | ||
} | ||
|
||
/** | ||
* Toggles the visibility of the footer views. | ||
*/ | ||
public void setFooterVisibility(boolean shouldShow) { | ||
for (View footer : mFooters) { | ||
footer.setVisibility(shouldShow ? View.VISIBLE : View.GONE); | ||
} | ||
} | ||
|
||
/** | ||
* @return the number of headers. | ||
*/ | ||
public int getHeaderCount() { | ||
return mHeaders.size(); | ||
} | ||
|
||
/** | ||
* @return the number of footers. | ||
*/ | ||
public int getFooterCount() { | ||
return mFooters.size(); | ||
} | ||
|
||
/** | ||
* Gets the indicated header, or null if it doesn't exist. | ||
*/ | ||
public View getHeader(int i) { | ||
return i < mHeaders.size() ? mHeaders.get(i) : null; | ||
} | ||
|
||
/** | ||
* Gets the indicated footer, or null if it doesn't exist. | ||
*/ | ||
public View getFooter(int i) { | ||
return i < mFooters.size() ? mFooters.get(i) : null; | ||
} | ||
|
||
private boolean isHeader(int viewType) { | ||
return viewType >= HEADER_VIEW_TYPE && viewType < (HEADER_VIEW_TYPE + mHeaders.size()); | ||
} | ||
|
||
private boolean isFooter(int viewType) { | ||
return viewType >= FOOTER_VIEW_TYPE && viewType < (FOOTER_VIEW_TYPE + mFooters.size()); | ||
} | ||
|
||
@Override | ||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { | ||
if (isHeader(viewType)) { | ||
int whichHeader = Math.abs(viewType - HEADER_VIEW_TYPE); | ||
View headerView = mHeaders.get(whichHeader); | ||
return new RecyclerView.ViewHolder(headerView) { }; | ||
} else if (isFooter(viewType)) { | ||
int whichFooter = Math.abs(viewType - FOOTER_VIEW_TYPE); | ||
View footerView = mFooters.get(whichFooter); | ||
return new RecyclerView.ViewHolder(footerView) { }; | ||
|
||
} else { | ||
return mBase.onCreateViewHolder(viewGroup, viewType); | ||
} | ||
} | ||
|
||
@Override | ||
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { | ||
if (position < mHeaders.size()) { | ||
// Headers don't need anything special | ||
|
||
} else if (position < mHeaders.size() + mBase.getItemCount()) { | ||
// This is a real position, not a header or footer. Bind it. | ||
mBase.onBindViewHolder(viewHolder, position - mHeaders.size()); | ||
|
||
} else { | ||
// Footers don't need anything special | ||
} | ||
} | ||
|
||
@Override | ||
public int getItemCount() { | ||
return mHeaders.size() + mBase.getItemCount() + mFooters.size(); | ||
} | ||
|
||
@Override | ||
public int getItemViewType(int position) { | ||
if (position < mHeaders.size()) { | ||
return HEADER_VIEW_TYPE + position; | ||
|
||
} else if (position < (mHeaders.size() + mBase.getItemCount())) { | ||
return mBase.getItemViewType(position - mHeaders.size()); | ||
|
||
} else { | ||
return FOOTER_VIEW_TYPE + position - mHeaders.size() - mBase.getItemCount(); | ||
} | ||
} | ||
} |
Oops, something went wrong.