RecycleView的分页加载和多布局

引包:
compile 'com.android.support:recyclerview-v7:24.2.1'
compile 'com.jakewharton:butterknife:8.4.0'
compile 'com.android.support:cardview-v7:24.2.1'

代码:
public class Album {
String name;
String artist;
int position;
int price;
public int getPrice() {
return price;
}

public void setPrice(int price) {
this.price = price;
}

public Album(String name, String artist) {
this.name = name;
this.artist = artist;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getArtist() {
return artist;
}

public void setArtist(String artist) {
this.artist = artist;
}

public int getPosition() {
return position;
}

public void setPosition(int position) {
this.position = position;
}

@Override
public String toString() {
return "Album{" +
"name='" + name + '\'' +
", artist='" + artist + '\'' +
'}';
}

}
*********************************************************************************
public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};

public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

private Drawable mDivider;

private int mOrientation;

public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}

public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}

@Override
public void onDraw(Canvas c, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}

public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();

final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}

public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();

final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}

@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
*********************************************************************************
public class ListActivity extends AppCompatActivity {

private static final String TAG = "test";
private ListView lv;
private List<Album> data = new ArrayList<>();
private MyListAdapter adapter;
int currentScrollState;
private View footerView;
int lastVisibleItem;

private Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
lv = ((ListView) findViewById(R.id.lv));
footerView = LayoutInflater.from(this).inflate(R.layout.footer,lv,false);

initData();

adapter = new MyListAdapter(this,data);
lv.setAdapter(adapter);

lv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(lastVisibleItem == data.size()-1 && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
lv.addFooterView(footerView);
handler.postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
data.add(new Album("MoreOne-"+i,"MoreArtist-"+i));
}
adapter.notifyDataSetChanged();
lv.removeFooterView(footerView);
}
}, 3000);
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
lastVisibleItem = firstVisibleItem + visibleItemCount - 1;
}
});
}


private void initData() {
for (int i = 0; i < 20; i++) {
Album album = new Album("专辑名称-" + i, "艺术家-" + i);
album.setPosition(i);
album.setPrice(200 + new Random().nextInt(200));
data.add(album);
}
}
}
*********************************************************************************
public class MainActivity extends AppCompatActivity implements MyAdapter.OnItemClickListener,MyAdapter.LoadMoreListener{

private static final String TAG = "test";
private RecyclerView rv;
private List<Album> data = new ArrayList<>();

private LinearLayoutManager linearLayoutManager;
private StaggeredGridLayoutManager staggeredGridLayoutManager;
private RecyclerView.LayoutManager currentLayoutManager = null;
private MyAdapter linearAdapter;
private MyAdapter gridAdapter;

private GridLayoutManager gridLayoutManager;
private MyAdapter currentAdapter;

private Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = (RecyclerView) findViewById(R.id.rv);

initData();
initAdapterAndLayout();
initAnimAndDecoration();

}

private void initAnimAndDecoration() {
rv.setItemAnimator(new DefaultItemAnimator());
rv.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
rv.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL_LIST));
}

private void initAdapterAndLayout() {
linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
gridLayoutManager = new GridLayoutManager(this,2, LinearLayoutManager.VERTICAL,false);
staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);//流式布局管理器

linearAdapter = new MyAdapter(this,data,MyAdapter.LINEAR_LAYOUT_MANAGER);
gridAdapter = new MyAdapter(this,data,MyAdapter.GRID_LAYOUT_MANAGER);
linearAdapter.setOnItemClickListener(this);
gridAdapter.setOnItemClickListener(this);
linearAdapter.setLoadMoreListener(this);
gridAdapter.setLoadMoreListener(this);

useLinearLayout();
}

private void initData() {
for (int i = 0; i < 20; i++) {
Album album = new Album("专辑名称-" + i, "艺术家-" + i);
album.setPosition(i);
album.setPrice(200 + new Random().nextInt(200));
data.add(album);
}
}

public void switchLayout(View view) {
if(currentLayoutManager == linearLayoutManager){
useGridLayout();
}else{
useLinearLayout();
}
}

private void useGridLayout() {
rv.setLayoutManager(gridLayoutManager);
rv.setAdapter(gridAdapter);
currentLayoutManager = gridLayoutManager;
currentAdapter = gridAdapter;
}

private void useLinearLayout() {
rv.setLayoutManager(linearLayoutManager);
rv.setAdapter(linearAdapter);
currentLayoutManager = linearLayoutManager;
currentAdapter = linearAdapter;
}

@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this, "MainActivity:"+data.get(position).getName(), Toast.LENGTH_SHORT).show();
}

public void addItem(View view) {
if(currentAdapter!=null){
data.add(0,new Album("NewOne","NewArtist"));
// currentAdapter.notifyDataSetChanged();
currentAdapter.onNotifyItemInserted(0,rv);
}
}

public void removeItem(View view) {
if(currentAdapter!=null){
data.remove(0);
// currentAdapter.notifyDataSetChanged();
currentAdapter.onNotifyItemRemoved(0,rv);
}
}

@Override
public void loadMore() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
data.add(new Album("MoreOne-"+i,"MoreArtist-"+i));
}
currentAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "分页数据加载完成!", Toast.LENGTH_SHORT).show();
}
}, 3000);
}

}
*********************************************************************************
public class MyAdapter extends RecyclerView.Adapter {

public static final int LINEAR_LAYOUT_MANAGER = 0;
public static final int GRID_LAYOUT_MANAGER = 1;

private int layoutManager = LINEAR_LAYOUT_MANAGER;
Context context;
List<Album> albums;

private View view;

public MyAdapter(Context context, List<Album> albums, int layoutManager) {
this.context = context;
this.albums = albums;
this.layoutManager = layoutManager;
}

public void setLayoutManager(int layoutManager) {
this.layoutManager = layoutManager;
notifyDataSetChanged();
}

@Override
public int getItemCount() {
return albums.size() + 1;
}

@Override
public int getItemViewType(int position) {
if (position == albums.size()) {
return 1;
} else {
return 0;
}
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
view = LayoutInflater.from(context).inflate(R.layout.footer, parent, false);
return new FooterHolder(view);
}

switch (layoutManager) {
case LINEAR_LAYOUT_MANAGER:
view = LayoutInflater.from(context).inflate(R.layout.item_rvadapter_linear, parent, false);
break;
case GRID_LAYOUT_MANAGER:
view = LayoutInflater.from(context).inflate(R.layout.item_rvadapter_grid, parent, false);
break;
}

return new Holder(view);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

if(holder instanceof FooterHolder){
if(loadMoreListener != null){
loadMoreListener.loadMore();
}
return;
}

Holder _holder = (Holder) holder;
Album album = albums.get(position);
_holder.tvAlbumn.setText(album.getName());
_holder.tvArtist.setText(album.getArtist());

_holder.cvRoot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(position);
}
}
});
}

LoadMoreListener loadMoreListener;

public void setLoadMoreListener(LoadMoreListener loadMoreListener) {
this.loadMoreListener = loadMoreListener;
}

interface LoadMoreListener {
void loadMore();
}

OnItemClickListener onItemClickListener;

interface OnItemClickListener {
void onItemClick(int position);
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}

public void onNotifyItemInserted(int positiion, RecyclerView rv) {
notifyItemInserted(positiion);
rv.scrollToPosition(0);
}

public void onNotifyItemRemoved(int positiion, RecyclerView rv) {
notifyItemRemoved(positiion);
rv.scrollToPosition(0);
}

static class Holder extends RecyclerView.ViewHolder {
@BindView(R.id.tvAlbumn)
TextView tvAlbumn;
@BindView(R.id.tvArtist)
TextView tvArtist;
@BindView(R.id.tvInfo)
TextView tvInfo;
@BindView(R.id.llRoot)
LinearLayout llRoot;
@BindView(R.id.cvRoot)
CardView cvRoot;

Holder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}

static class FooterHolder extends RecyclerView.ViewHolder {
@BindView(R.id.pb)
ProgressBar pb;
@BindView(R.id.tv)
TextView tv;

FooterHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
*********************************************************************************
public class MyListAdapter extends BaseAdapter {

private final LayoutInflater inflater;
Context context;
List<Album> data;

public MyListAdapter(Context context, List<Album> data) {
this.context = context;
this.data = data;
inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
return data.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_rvadapter_linear, parent, false);
holder = new Holder(convertView);
convertView.setTag(holder);
}else {
holder = ((Holder) convertView.getTag());
}

Album album = data.get(position);
holder.tvAlbumn.setText(album.getName());
holder.tvArtist.setText(album.getArtist());

return convertView;
}


static class Holder {
@BindView(R.id.tvAlbumn)
TextView tvAlbumn;
@BindView(R.id.tvArtist)
TextView tvArtist;
@BindView(R.id.tvInfo)
TextView tvInfo;
@BindView(R.id.llRoot)
LinearLayout llRoot;
@BindView(R.id.cvRoot)
CardView cvRoot;

Holder(View view) {
ButterKnife.bind(this, view);
}
}

}
布局文件:
*********************************************************************************
(activity_list)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</LinearLayout>
*********************************************************************************
(activity_main)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.shenzhen.recyclerviewdemo.MainActivity">

<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="switchLayout"
android:text="切换布局" />

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="addItem"
android:text="增加条目" />

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="removeItem"
android:text="移除条目" />
</LinearLayout>

</LinearLayout>
*********************************************************************************
(footer)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="@dimen/activity_vertical_margin">

<ProgressBar
android:id="@+id/pb"
style="@android:style/Widget.Holo.ProgressBar.Small"
android:layout_width="30dp"
android:layout_height="30dp"/>

<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_marginLeft="8dp"
android:text="正在加载..."/>

</LinearLayout>
*********************************************************************************
(item_lv_i)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="5dp">

<ImageView
android:id="@+id/iv"
android:layout_width="65dp"
android:layout_height="65dp"
android:src="@mipmap/ic_launcher" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="10dp">

<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text1"
android:textColor="#000"
android:textSize="25sp" />

<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text2"
android:textSize="15sp" />

</LinearLayout>

</LinearLayout>
*********************************************************************************
(item_rvadapter_grid)
<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cvRoot"
android:layout_width="match_parent"
android:layout_height="250dp"
app:cardCornerRadius="10dp"
app:cardElevation="10dp">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="0dp"
android:background="@drawable/selector_item_bg"
android:padding="10dp"
android:gravity="center"
android:orientation="vertical">

<RelativeLayout
android:layout_width="140dp"
android:layout_height="140dp">

<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
android:background="@color/blueTransprent"
android:src="@mipmap/ic_launcher" />


<TextView
android:id="@+id/tvAlbumn"
style="@style/AlbumTextAppearance"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/blackTransparent"
android:gravity="center"
android:layout_alignParentBottom="true"
android:textColor="@color/white"
android:padding="5dp"
android:text="专辑名称"
android:textSize="20sp"
android:textStyle="bold" />
</RelativeLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">

<TextView
android:id="@+id/tvArtist"
style="@style/AlbumTextAppearance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:text="艺术家"
android:textColor="@color/grayDark"
android:textStyle="italic" />

<TextView
android:id="@+id/tvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="专辑简介" />

</LinearLayout>

</LinearLayout>
</android.support.v7.widget.CardView>
*********************************************************************************
(item_rvadapter_linear)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cvRoot"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="10dp"
app:cardElevation="10dp">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llRoot"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_margin="0dp"
android:background="@drawable/selector_item_bg"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp">

<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
android:background="@color/blueTransprent"
android:src="@mipmap/ic_launcher" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="10dp">

<TextView
android:id="@+id/tvAlbumn"
style="@style/AlbumTextAppearance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="专辑名称"
android:textStyle="bold" />

<TextView
android:id="@+id/tvArtist"
style="@style/AlbumTextAppearance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:text="艺术家"
android:textColor="@color/grayDark"
android:textStyle="italic" />

<TextView
android:id="@+id/tvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="专辑简介" />

</LinearLayout>

</LinearLayout>
</android.support.v7.widget.CardView>

*********************************************************************************

运行结果:


点击切换布局:


加载更多:

增加条目:


增加条目:


移除条目:


猜你喜欢

转载自blog.csdn.net/yang__k/article/details/80216592
今日推荐