RecyclerView在android5.0之后被引进,可以通过导入support-v7对其进行使用。
据官方的介绍,该控件用于在有限的窗口中展示大量数据集。提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
• 你想要控制其显示的方式,请通过布局管理器LayoutManager
• 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
• 你想要控制Item增删的动画,请通过ItemAnimator
据官方的介绍,该控件用于在有限的窗口中展示大量数据集。提供了一种插拔式的体验,高度的解耦,异常的灵活,
通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
• 你想要控制其显示的方式,请通过布局管理器LayoutManager
• 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
• 你想要控制Item增删的动画,请通过ItemAnimator
• 你想要控制点击、长按事件,请自己写
1 .RecyclerView的基本展示
public class RecycleerActivity01 extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> mdatas;
private BasicAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleer01);
recyclerView = (RecyclerView) findViewById(R.id.id_rv);
//数据源
initData();
//想recycleView中添加数据,使用适配器
adapter = new BasicAdapter(mdatas, this);
recyclerView.setAdapter(adapter);
//声明布局管理器,设置RecycleView最终展示的效果,最后一个参数是是否反转数据
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
//设置增加条目的动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapter.setOnItemClickListener(new BasicAdapter.OnItemClickListener1() {
@Override
public void onItemClick(View itemView, int position) {
Toast.makeText(RecycleerActivity01.this, "你点击了" + mdatas.get(position), Toast.LENGTH_SHORT).show();
}
@Override
public void onLongItemClick(View itemView, int position) {
Toast.makeText(RecycleerActivity01.this, "你长按点击了" + mdatas.get(position), Toast.LENGTH_SHORT).show();
}
});
}
private void initData() {
mdatas = new ArrayList<>();
for (int i = 0; i < 48; i++) {
mdatas.add("第" + i + "条数据");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add:
adapter.addData(1);
break;
case R.id.delete:
adapter.removeData(1);
case R.id.diplay_lv:
LinearLayoutManager manget = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(manget);
break;
case R.id.diplay_gv:
GridLayoutManager manage = new GridLayoutManager(this, 3);
recyclerView.setLayoutManager(manage);
break;
case R.id.diplay_hlv:
StaggeredGridLayoutManager ma = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(ma);
break;
case R.id.diplay_hgv:
StaggeredGridLayoutManager mm = new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(mm);
break;
case R.id.diplay_staggered:
Intent intent = new Intent(this, StaggeredActivity.class);
startActivity(intent);
break;
}
return super.onOptionsItemSelected(item);
}
public class BasicAdapter extends RecyclerView.Adapter<BasicAdapter.BasicViewHolder> {
private List<String> mdatas;
private Context context;
private OnItemClickListener1 listener;//使用RecyclerView,你想要控制点击、长按事件,需要自写
public BasicAdapter(List<String> mdatas, Context context) {
this.mdatas = mdatas;
this.context = context;
}
public void setOnItemClickListener(OnItemClickListener1 listener) {
this.listener = listener;
}
public interface OnItemClickListener1 {
public void onItemClick(View itemView, int position);
public void onLongItemClick(View itemView, int position);
}
//创建一个viewholder 并且返回出去
@Override
public BasicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context).inflate(R.layout.item_recycle01, parent, false);
BasicViewHolder holder = new BasicViewHolder(itemView);
return holder;
}
//绑定viewholder 在这个方法中,完成赋值操作
@Override
public void onBindViewHolder(BasicViewHolder holder, int position) {
holder.tv.setText(mdatas.get(position));
setUpEvent(holder);
}
protected void setUpEvent(final BasicViewHolder holder) {
if (listener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int pos = holder.getLayoutPosition();
listener.onItemClick(holder.itemView, pos);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = holder.getLayoutPosition();
listener.onLongItemClick(holder.itemView, position);
return false;
}
});
}
}
public void addData(int pos) {
mdatas.add(pos, "insert one");
notifyItemChanged(pos);
}
public void removeData(int pos) {
mdatas.remove(pos);
notifyItemRemoved(pos);
}
@Override
public int getItemCount() {
return mdatas.size();
}
class BasicViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public BasicViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.id_tv1);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add"
android:icon="@android:drawable/ic_menu_add"
android:orderInCategory="100"
android:title="add"
app:showAsAction="always"></item>
<item
android:id="@+id/delete"
android:icon="@android:drawable/ic_menu_delete"
android:orderInCategory="100"
android:title="remove"
app:showAsAction="always"></item>
<item
android:id="@+id/comment"
android:orderInCategory="100"
android:title="展示类型"
app:showAsAction="always">
<menu>
<item
android:id="@+id/diplay_lv"
android:orderInCategory="100"
android:title="just like ListView"></item>
<item
android:id="@+id/diplay_gv"
android:orderInCategory="100"
android:title="just like GridView"></item>
<item
android:id="@+id/diplay_hlv"
android:orderInCategory="100"
android:title="Horizontal ListView"></item>
<item
android:id="@+id/diplay_hgv"
android:orderInCategory="100"
android:title="Horizontal GridView"></item>
<item
android:id="@+id/diplay_staggered"
android:orderInCategory="100"
android:title="Staggered View"></item>
</menu>
</item>
</menu>
<android.support.v7.widget.RecyclerView
android:id="@+id/id_rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
2.RecyclerView的切换展示
public class RecycleerActivity02 extends AppCompatActivity {
private String url = "http://appsrv.flyxer.com/api/digest/recomm/dests?page=1";
private RecyclerView recyclerView;
private listAdapter adapter;
private GridAdapter gridAdapter;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleer01);
recyclerView = (RecyclerView) findViewById(R.id.id_rv);
context = this;
loadData(url);
}
private void loadData(String url) {
RequestParams params = new RequestParams(url);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
List<ParseRootData.RootData> rootbean = ParseRootData.parseData(result);
adapter = new listAdapter(context, rootbean);
gridAdapter = new GridAdapter(context, rootbean);
recyclerView.setAdapter(adapter);
LinearLayoutManager manager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(manager);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.country, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.list:
recyclerView.setAdapter(adapter);
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(manager);
break;
case R.id.grid:
recyclerView.setAdapter(gridAdapter);
GridLayoutManager man = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(man);
break;
}
return super.onOptionsItemSelected(item);
}
}
3 .RecyclerView的照片墙展示 瀑布流,高度不同
public class RecycleerActivity03 extends AppCompatActivity {
private RecyclerView recyclerView;
private PhotoWallAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleer01);
recyclerView = (RecyclerView) findViewById(R.id.id_rv);
adapter = new PhotoWallAdapter(RecycleerActivity03.this);
recyclerView.setAdapter(adapter);
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
}
}
public class PhotoWallAdapter extends RecyclerView.Adapter<PhotoWallAdapter.PhotoViewHolder> {
private Context context;
private List<Integer> mHeight;
private String imgUrls[];
public PhotoWallAdapter(Context context) {
this.context = context;
imgUrls = ImageUrls.imageurls;
mHeight = new ArrayList<>();
for (int i = 0; i < imgUrls.length; i++) {
mHeight.add((int)(300+Math.random()*400));
}
}
@Override
public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context).inflate(R.layout.item_stagger,parent,false);
PhotoViewHolder holder = new PhotoViewHolder(itemView);
return holder;
}
@Override
public void onBindViewHolder(PhotoViewHolder holder, int position) {
ViewGroup.LayoutParams lp = holder.iv.getLayoutParams();
lp.height = mHeight.get(position);
holder.iv.setLayoutParams(lp);
ImageOptions options = new ImageOptions.Builder().setFailureDrawableId(R.mipmap.ic_launcher)
.setLoadingDrawableId(R.mipmap.ic_launcher).build();
x.image().bind(holder.iv,imgUrls[position],options);
}
@Override
public int getItemCount() {
return imgUrls.length;
}
class PhotoViewHolder extends RecyclerView.ViewHolder{
ImageView iv;
public PhotoViewHolder(View itemView) {
super(itemView);
iv = (ImageView)itemView.findViewById(R.id.id_iv);
}
}
}
4.RecyclerView的本地数据分页加载 含下拉刷新和上拉加载
public class RecycleerActivity04 extends AppCompatActivity {
private RecyclerView recyclerView;
private SwipeRefreshLayout swipeRefreshLayout;
private List<Map<String, String>> datas;
private LinearLayoutManager manager;
private RecyclerAdapter4 adapter;
private boolean isLoading = false;//判断是否处于上拉加载的状态
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleer04);
initView();
setEvent();
}
private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.id_rv);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.sr1);
swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN);
manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(manager);
datas = new ArrayList<>();
getData();
adapter = new RecyclerAdapter4(this, datas);
recyclerView.setAdapter(adapter);
}
private void setEvent() {
//设置下拉刷新的操作
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
datas.clear();
getData();
adapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
}, 3000);
}
});//设置上拉加载的监听器
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//获得可见条目的最后一条位置
int lastVisibleItemPosition = manager.findLastVisibleItemPosition();
if (lastVisibleItemPosition + 1 == adapter.getItemCount()) {
boolean isRefresh = swipeRefreshLayout.isRefreshing();
if (isRefresh) {
return;
}
if (!isLoading) {
isLoading = true;
//没有处于加载状态,需要加载数据,就可以进行分页加载
handler.postDelayed(new Runnable() {
@Override
public void run() {
getData();
adapter.notifyDataSetChanged();
adapter.notifyItemRemoved(adapter.getItemCount());
isLoading = false;
}
}, 4000);
}
}
}
});
}
private void getData() {
int size = datas.size();
for (int i = 0; i < 20; i++) {
Map<String, String> map = new HashMap<>();
map.put("title", "title======" + (i + size));
map.put("summary", "summary----" + (i + size));
datas.add(map);
}
}
}
public class RecyclerAdapter4 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<Map<String, String>> mDatas;
private final int TYPE_COMMON = 0;
private final int TYPE_FOOTER = 1;
public RecyclerAdapter4(Context context, List<Map<String, String>> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
/**
* 获得指定的位置上的显示类型
*/
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return TYPE_COMMON;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_COMMON) {
View itemView = LayoutInflater.from(context).inflate(R.layout.item_recycler04, parent, false);
ItemViewHolder itemViewHolder = new ItemViewHolder(itemView);
return itemViewHolder;
} else {
View footerView = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false);
FooterViewHolder holder = new FooterViewHolder(footerView);
return holder;
}
}
@Override
public int getItemCount() {
return mDatas.size() == 0 ? 0 : mDatas.size() + 1;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) {
((ItemViewHolder) holder).tv_name.setText(mDatas.get(position).get("title"));
((ItemViewHolder) holder).tv_summary.setText(mDatas.get(position).get("summary"));
}
}
class ItemViewHolder extends RecyclerView.ViewHolder {
TextView tv_name, tv_summary;
public ItemViewHolder(View itemView) {
super(itemView);
tv_name = (TextView) itemView.findViewById(R.id.tv_name);
tv_summary = (TextView) itemView.findViewById(R.id.tv_summary);
}
}
class FooterViewHolder extends RecyclerView.ViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
}
5. RecyclerView的网络 数据分页加载
public class RecycleerActivity05 extends AppCompatActivity {
private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=";
private int page = 1;
private RecyclerView mRecyclerView;
private SwipeRefreshLayout swipeRefreshLayout;
private List<ParseFoodData.Food> mDatas;
private LinearLayoutManager manager;
private FoodAdapter adapter;
private boolean isLoading = false;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleer04);
initView();
loadData(url, 1);
setEvent();
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.id_rv);
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.sr1);
swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN);
manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
mRecyclerView.setLayoutManager(manager);
mDatas = new ArrayList<>();
adapter = new FoodAdapter(this, mDatas);
mRecyclerView.setAdapter(adapter);
}
private void loadData(String url, int index) {
RequestParams params = new RequestParams(url + index);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
List<ParseFoodData.Food> list = ParseFoodData.parseData(result);
if (list != null && list.size() != 0) {
mDatas.addAll(list);
page++;
adapter.notifyDataSetChanged();
isLoading = false;
} else {
adapter.notifyItemRemoved(adapter.getItemCount());
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
private void setEvent() {
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
}, 2000);
}
});
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastPos = manager.findLastVisibleItemPosition();
if (lastPos + 1 == adapter.getItemCount()) {
if (swipeRefreshLayout.isRefreshing()) {
return;
}
if (!isLoading) {
isLoading = true;
loadData(url, page);
}
}
}
});
}
}
public class FoodAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<ParseFoodData.Food> datas;
private final int TYPE_COMMON = 0;
private final int TYPE_FOOTER = 1;
public FoodAdapter(Context context, List<ParseFoodData.Food> datas) {
this.context = context;
this.datas = datas;
}
/**
* 获得指定的位置上的显示类型
* */
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return TYPE_COMMON;
}
//创建viewholder的方法,可以通过判断viewType,创建不同位置的不同布局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_COMMON) {
View itemview = LayoutInflater.from(context).inflate(R.layout.item_list, parent, false);
ItemViewHolder itemViewHolder = new ItemViewHolder(itemview);
return itemViewHolder;
} else {
View footView = LayoutInflater.from(context).inflate(R.layout.item_footer, parent, false);
FooterViewHolder holder = new FooterViewHolder(footView);
return holder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder){
((ItemViewHolder)holder).tv_name.setText(datas.get(position).getTitle());
((ItemViewHolder)holder).tv_summary.setText("材料:"+datas.get(position).getFood_str());
ViewGroup.LayoutParams lp = ((ItemViewHolder) holder).icon.getLayoutParams();
lp.height =200;
lp.width=300;
((ItemViewHolder) holder).icon.setLayoutParams(lp);
ImageOptions options = new ImageOptions.Builder().setLoadingDrawableId(R.mipmap.ic_launcher)
.setFailureDrawableId(R.mipmap.ic_launcher).build();
x.image().bind(((ItemViewHolder) holder).icon,datas.get(position).getPic(),options);
}
}
//获取数据的数量
@Override
public int getItemCount() {
return datas.size() == 0 ? 0 : datas.size() + 1;
}
class ItemViewHolder extends RecyclerView.ViewHolder {
TextView tv_name, tv_summary;
ImageView icon;
public ItemViewHolder(View itemView) {
super(itemView);
tv_name = (TextView) itemView.findViewById(R.id.tv_name);
tv_summary = (TextView) itemView.findViewById(R.id.tv_summary);
icon = (ImageView) itemView.findViewById(R.id.icon);
}
}
class FooterViewHolder extends RecyclerView.ViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
}
导入的包有 如下
<RelativeLayout 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" tools:context="com.jht.administrator.day05.RecycleerActivity04"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/sr1" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/id_rv" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout> </RelativeLayout>