RecyclerView的GridView和ListView的混排处理的解决方式

 

 

不会放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处理不同的逻辑。

写的不是很好,望理解!如果有写的不对的地方,请各位大婶吐槽,谢谢。

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值