不会放gif,大家见谅!
公司有个项目,想实现一个RecyclerView中包含GridView和ListView的混排,并且支持上拉下拉,之前看了郭神公众号里面分享了LRecyclerView,下了demo感觉还不错。然后我就运用到了项目中,发现LRecyclerView如果addHeader(headview如果是listview或者是gridview的话,会与LRecyclerView中的onTouch事件冲突,就放弃addHeader)。
实现过程如下:
1、
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
<com.github.jdsjlzx.recyclerview.LRecyclerView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
xml中就是一个LRecyclerVIew,没什么好说的。
2、
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_emptyview);
mRecyclerView = (LRecyclerView) findViewById(R.id.list);
for (int i = 0 ; i < 20; i++){
YbEntity ybEntity = new YbEntity();
if(i<10){
ybEntity.setType(1);
ybEntity.setTitle("i am list "+i);
}else{
ybEntity.setType(2);
ybEntity.setTitle("i am grid "+i);
}
mYbEntities.add(ybEntity);
}
mReclerAdapter = new YbReclerAdapter(this,mYbEntities);
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
mRecyclerView.setLayoutManager(gridLayoutManager);
mLRecyclerViewAdapter = new LRecyclerViewAdapter(mReclerAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
Log.w("infos", "---> yb getSpanSize position = " + position);
switch (mLRecyclerViewAdapter.getItemViewType(position)) {
case 1:
return 4;
case 2:
return 2;
default:
return 1;
}
}
});
mRecyclerView.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mRecyclerView.refreshComplete(10);
}
},1000);
}
});
mRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0 ; i < 20; i++){
YbEntity ybEntity = new YbEntity();
ybEntity.setType(3);
ybEntity.setTitle("i am grid 第二批"+i);
mYbEntities.add(ybEntity);
}
mRecyclerView.refreshComplete(10);
mLRecyclerViewAdapter.notifyDataSetChanged();
}
},1000);
}
});
}
重点说一下:
gridLayoutManager.setSpanSizeLookup:
查看源码:
/**
* Sets the source to get the number of spans occupied by each item in the adapter.
*
* @param spanSizeLookup {@link SpanSizeLookup} instance to be used to query number of spans
* occupied by each item
*/
public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {
mSpanSizeLookup = spanSizeLookup;
}
意思是:每一条占用的跨度数。(我认为就有点像:LinearLayout中的weight)比如demo中我new GridLayoutManager
的是给设置是是4,当调用gridLayoutManager.setSpanSizeLookup,判断对应的type,当type为1时,return 4,意思是它对
应占用了4个跨度,刚好就相当于一个ListView,return 2相当于2个item的GridView。
值得注意的是:
gridLayoutManager.setSpanSizeLookup这个方法调用时一定要在serAdapter()方法
之后,才会执行。
最后在贴一下adapter:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.w(TAG,"---> yb viewType "+viewType);
if (viewType == 1) {
return new YbListHolder(mLayoutInflater.inflate(
R.layout.yb_item_list, parent, false));
} else if (viewType == 2) {
return new YbGridHolder(mLayoutInflater.inflate(
R.layout.yb_item_grid, parent, false));
}else{
return new YbCommonHolder(mLayoutInflater.inflate(
R.layout.yb_item_common, parent, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof YbListHolder){
YbListHolder ybListHolder = (YbListHolder) holder;
ybListHolder.listText.setText(ybEntities.get(position).getTitle());
}else if(holder instanceof YbGridHolder){
YbGridHolder ybListHolder = (YbGridHolder) holder;
ybListHolder.gridText.setText(ybEntities.get(position).getTitle());
}else{
YbCommonHolder ybListHolder = (YbCommonHolder) holder;
ybListHolder.item_common_text.setText("common --> ");
}
}
根据前面list传过来的数据的type来判断,然后创建不同的VierHolder处理不同的逻辑。
写的不是很好,望理解!如果有写的不对的地方,请各位大婶吐槽,谢谢。