zoukankan      html  css  js  c++  java
  • 给recycleview加headview

    参考了https://blog.csdn.net/qibin0506/article/details/49716795

    由于recycleview没有直接添加头部view的api,所以需要我们自己去添加,下面贴上代码

    public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    
        public static final int TYPE_HEADER = 0;
        public static final int TYPE_NORMAL = 1;
    
        private ArrayList<String> mDatas = new ArrayList<>();
    
        private View mHeaderView;
    
        private OnItemClickListener mListener;
    
        public void setOnItemClickListener(OnItemClickListener li) {
            mListener = li;
        }
    
        public void setHeaderView(View headerView) {
            mHeaderView = headerView;
            notifyItemInserted(0);
        }
    
        public View getHeaderView() {
            return mHeaderView;
        }
    
        public void addDatas(ArrayList<String> datas) {
            mDatas.addAll(datas);
            notifyDataSetChanged();
        }
    
        @Override
        public int getItemViewType(int position) {
            if(mHeaderView == null) return TYPE_NORMAL;
            if(position == 0) return TYPE_HEADER;
            return TYPE_NORMAL;
        }
    
    //此方法确保网格布局时头部item占据一整行
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
            if(manager instanceof GridLayoutManager) {
                final GridLayoutManager gridManager = ((GridLayoutManager) manager);
                gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                    @Override
                    public int getSpanSize(int position) {
                        return getItemViewType(position) == TYPE_HEADER
                                ? gridManager.getSpanCount() : 1;
                    }
                });
            }
        }
    
        @Override
        public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
            super.onViewAttachedToWindow(holder);
            ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
            if(lp != null
                    && lp instanceof StaggeredGridLayoutManager.LayoutParams) {
                StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
                p.setFullSpan(holder.getLayoutPosition() == 0);
            }
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if(mHeaderView != null && viewType == TYPE_HEADER) return new Holder(mHeaderView);
            View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
            return new Holder(layout);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
            if(getItemViewType(position) == TYPE_HEADER) return;
    
            final int pos = getRealPosition(viewHolder);
            final String data = mDatas.get(pos);
            if(viewHolder instanceof Holder) {
                ((Holder) viewHolder).text.setText(data);
                if(mListener == null) return;
                viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mListener.onItemClick(pos, data);
                    }
                });
            }
        }
    
        public int getRealPosition(RecyclerView.ViewHolder holder) {
            int position = holder.getLayoutPosition();
            return mHeaderView == null ? position : position - 1;
        }
    
        @Override
        public int getItemCount() {
            return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
        }
    
        class Holder extends RecyclerView.ViewHolder {
    
            TextView text;
    
            public Holder(View itemView) {
                super(itemView);
                if(itemView == mHeaderView) return;
                text =  itemView.findViewById(R.id.text);
            }
        }
    
        interface OnItemClickListener {
            void onItemClick(int position, String data);
        }
    }
    public class MainActivity extends AppCompatActivity {
        RecyclerView mRecyclerView;
        LinearLayoutManager mLayoutManager;
        MyAdapter mAdapter;
        ArrayList<String> list;
        Button bt;
        View header;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mRecyclerView = (RecyclerView) findViewById(R.id.list);
            bt = findViewById(R.id.bt);
    
           // mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
            mLayoutManager = new GridLayoutManager(this, 2);
            mRecyclerView.setLayoutManager(mLayoutManager);
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    
            mAdapter = new MyAdapter();
            mRecyclerView.setAdapter(mAdapter);
            mAdapter.addDatas(generateData());
            setHeader(mRecyclerView);
            mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(int position, String data) {
                    Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
                }
            });
    
    
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(MainActivity.this, "你点击了头部", Toast.LENGTH_SHORT).show();
                }
            });
    
    
        }
    
        private void setHeader(RecyclerView view) {
            header = LayoutInflater.from(this).inflate(R.layout.header, view, false);
            bt = header.findViewById(R.id.bt);
            mAdapter.setHeaderView(header);
        }
    
        private ArrayList<String> generateData() {
            list = new ArrayList<>();
            list.clear();
            for (int i = 0; i < 30; i++) {
                list.add("" + i);
            }
            return list;
        }
    }
    
    
    <!--这是recycleview的item-->

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="36dp">
        <TextView
            android:id="@+id/text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center" />
    </LinearLayout>
    <?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="36dp"
        android:orientation="horizontal">
    <!--这是headview的布局-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="我是头部啊" />
    
        <View
            android:layout_width="100dp"
            android:layout_height="match_parent" />
    
        <Button
            android:id="@+id/bt"
            android:layout_width="80dp"
            android:layout_height="match_parent"
            android:text="点我" />
    </LinearLayout>
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 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"
        tools:context=".MainActivity">
    
     <android.support.v7.widget.RecyclerView
         android:id="@+id/list"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
    
     </android.support.v7.widget.RecyclerView>
    </android.support.constraint.ConstraintLayout>
  • 相关阅读:
    centos6 vps部署rails
    初始设置ubuntu 16.04 Vps部署rails
    自己买的书籍
    linux mint 18.2 install erlang
    Bunder: What does :require => nil in Gemfile mean?
    javascript箭头函数
    SharpGL学习笔记(一) 平台构建与Opengl的hello World
    动力学仿真引擎ODE的学习笔记,C#演示(一)
    设计模式之 面向对象的养猪厂的故事,C#演示(二)
    设计模式之 面向对象的养猪厂的故事,C#演示(一)
  • 原文地址:https://www.cnblogs.com/laoyimou/p/9329207.html
Copyright © 2011-2022 走看看